首页 > 其他分享 >"最小惊讶"和可变的默认参数

"最小惊讶"和可变的默认参数

时间:2023-10-28 19:23:19浏览次数:31  
标签:函数 Python 惊讶 默认 参数 可变 foo def

内容来自 DOC https://q.houxu6.top/?s="最小惊讶"和可变的默认参数

"最小惊讶"和可变的默认参数

任何长时间使用Python的人都会被以下问题困扰(或者被撕裂):

def foo(a=[]):
    a.append(5)
    return a

Python新手会期望这个没有参数的函数总是返回一个只有一个元素的列表:[5]。结果却大相径庭,非常令人惊讶(对于一个新手来说):

>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()

我的一位经理第一次遇到这个问题,称其为语言的“设计缺陷”。我回答说这种行为有一个基本的解释,如果你不了解内部原理,确实会感到困惑和意外。然而,我无法回答(给自己)以下问题:为什么在函数定义时绑定默认参数,而不是在函数执行时?我怀疑这种经验行为在实际应用中没有实际用途(谁真的在C语言中使用了静态变量,而不产生错误?)

编辑

Baczek提出了一个有趣的例子。结合你的大部分评论,特别是Utaal的评论,我进一步阐述了:

def a():
    print("a executed")
    return []

def b(x=a()):
    x.append(5)
    print(x)

a executed
>>> b()
[5]
>>> b()
[5, 5]

对我来说,这个设计决策似乎与参数的作用域有关:是在函数内部还是与它“一起”?

在函数内部进行绑定意味着在函数调用时,x实际上会被绑定到指定的默认值,而不是在定义时。这似乎是一个深刻的缺陷:def行在某种程度上是“混合”的,因为在定义行执行时,函数对象的绑定(以及默认参数的赋值)会发生。

实际的行为更加一致:在定义行执行时,该行的所有内容都会被计算。


实际上,这不是设计缺陷,也不是因为内部或性能问题。这只是因为 Python 中的函数是一等对象,不仅仅是一段代码。

当你这样想时,就完全明白了:函数是在定义时被求值的对象;默认参数是“成员数据”,因此它们的状态可能会在一次调用到另一次调用之间发生变化——就像在任何其他对象中一样。

无论如何,effbot(Fredrik Lundh)对这种行为的原因有很好的解释,可以参考他在Python中的默认参数值中的文章。

我觉得很清楚,我非常建议阅读它,以便更好地了解函数对象的工作原理。

标签:函数,Python,惊讶,默认,参数,可变,foo,def
From: https://www.cnblogs.com/xiaomandujia/p/17794493.html

相关文章

  • Tita 升级|「OKR」支持设置企业默认可见范围
    升级详情Tita-OKR和新绩效一体化管理平台一、企业默认目标可见范围 1.OKR创建过程忘记修改可见范围可能导致输据泄露,现在企业可设置自己偏好的目标可见范围管理员可在企业管理规定>OKR规定>目标默认可见范围中进行设置2.开启后有什么影响创建目标时,会与企业设置的......
  • openapi-generator修改默认生成的Model文件名称
    openapi-generator为各种语言都以抽象类的形式进行了默认配置以Typescript为例,其中的抽象类路径为openapi-generator\modules\openapi-generator\src\main\java\org\openapitools\codegen\languages\AbstractTypeScriptClientCodegen.java其中的toTypescriptTypeName方法则对生......
  • 获取Java21所有启动参数及默认值
    各版本获取启动参数命令:java-XX:+PrintFlagsFinal-version>jvm_flags.txt所有参数:[Globalflags]intActiveProcessorCount=-1{product}{default}uintxAdaptiveSizeDecrementScaleFactor......
  • `plt.subplots()`是matplotlib库中的一个函数,用于创建一个新的图形窗口和一组子图²。
    `plt.subplots()`是matplotlib库中的一个函数,用于创建一个新的图形窗口和一组子图²。以下是它的参数说明:-`nrows`:整数,默认为1。设置图表的行数¹²。-`ncols`:整数,默认为1。设置图表的列数¹²。-`sharex`,`sharey`:布尔值或{'none','all','row','col'},默认为False。控制x(s......
  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等。当然还有切换共享文件存储的需求,在第一次安装Rainbond时,大多数都......
  • 默认为false导致实例创建失败和成功问题
    一个列表上面每一条数据上面有一个查看按钮,点击查看按钮显示3个tab,选中监控设备后显示前后设备摄像头,用的是萤石的视频插件,页面id存在时创建一个实例进行监控视频显示我各种方法各种原因都用上了,搞了好久,想破脑袋都不知道为什么?最后正常了,但是只有一个正常错的显示正常的不显示,心塞......
  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    基于主机安装或基于Kubernetes安装的Rainbond集群(均使用默认参数安装),默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等......
  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    基于主机安装或基于Kubernetes安装的Rainbond集群(均使用默认参数安装),默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等......
  • 卸载wps之后office文件图标变白和默认打开软件改不了问题
    (3封私信/23条消息)卸载WPS后,桌面office文件图标变白,如何解决?-知乎(zhihu.com)  修复好之后就行,win11亲测可用......
  • 2023-10-26 ts报异常:并非所有代码路径都返回值 ==》给一个默认的返回值
    在函数中添加了判断且包含了return,如:if(isTrial){returnalert("666");}那么ts就会报这个异常,这也不算错误,但从ts的严格模式来看,是要给定一个默认返回值才行。解决方案:if(isTrial){returnalert("666");}returnaler......