一段有趣的代码

2018 年 5 月 11 日
 SingeeKing
def buggy(arg, result=[]):
    print(result)
    result.append(arg)
    print(result)

buggy('a')
buggy('b')
buggy('c')

学到了新知识……

https://stackoverflow.com/questions/2335160/what-is-the-scope-of-a-defaulted-parameter-in-python

7250 次点击
所在节点    Python
27 条回复
WilliamYang
2018 年 5 月 11 日
是有多无聊?
pwrliang
2018 年 5 月 11 日
我不认为这是无聊,这可能会是一个没有注意到的坑
shihira
2018 年 5 月 11 日
对啊,函数的默认参数是属于静态变量来的,包括 doc 串

```
def A():
'i am A'
pass
help(A)
a.__doc__ = "i am not A"
help(A)
```
raptor
2018 年 5 月 11 日
不要在参数默认值中使用引用类型这难道不应该是常识?
lance6716
2018 年 5 月 11 日
为什么要钻牛角尖…正常情况下根本不会出现这种代码
aice114
2018 年 5 月 11 日
默认参数使用引用类型就是这样,以前看过一本 python 书还举了例子
binux
2018 年 5 月 11 日
@raptor #4 还真不是常识,比如 JS 就不是这样的。
vegito2002
2018 年 5 月 11 日
我觉得这个还挺有意思的.
OldPanda
2018 年 5 月 11 日
@raptor 所谓的常识都是这样踩坑踩出来的
aijam
2018 年 5 月 11 日
这是 python 的知名坑
FrankFang128
2018 年 5 月 11 日
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Default_parameters#%E4%BC%A0%E5%85%A5_undefined_vs_%E5%85%B6%E4%BB%96%E7%A9%BA%E5%80%BC
在函数被调用时,参数默认值会被解析,所以不像 Python 中的例子,每次函数调用时都会创建一个新的参数对象。


MDN 点名批评 Python
aijam
2018 年 5 月 11 日
@FrankFang128 这句话写的看起来有歧义
aipansiyouyun
2018 年 5 月 11 日
又一个标题党
ryuzaki113
2018 年 5 月 11 日
这个属于 Python 的坑,基本上都会踩到
mimzy
2018 年 5 月 11 日
通常推荐使用 None 代替。基本上每个 Python 教程都会提到这个问题 比如官方入门:

https://docs.python.org/3/tutorial/controlflow.html#default-argument-values
lolizeppelin
2018 年 5 月 11 日
IDE 会警告的啊
siteshen
2018 年 5 月 11 日
无数人讲过 python 默认参数的“坑”了,我提供另外一个思路,函数尽量不要有副作用。这样无论 python 内部怎么实现,都不会出现问题(当然如果是性能不足,肯定需要研究语言的实现机制)。
ybping
2018 年 5 月 11 日
python 一切都是对象
akiakiseofficial
2018 年 5 月 11 日
@aice114 fluent Python 有讲过
xiongshengyao
2018 年 5 月 11 日
最开始学 python 的时候,你看的入门书籍里没告诉过你不要这样写?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/453924

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX