一段有趣的代码

2018-05-11 00:04:39 +08:00
 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

6387 次点击
所在节点    Python
27 条回复
WilliamYang
2018-05-11 00:12:09 +08:00
是有多无聊?
pwrliang
2018-05-11 00:13:51 +08:00
我不认为这是无聊,这可能会是一个没有注意到的坑
shihira
2018-05-11 00:23:24 +08:00
对啊,函数的默认参数是属于静态变量来的,包括 doc 串

```
def A():
'i am A'
pass
help(A)
a.__doc__ = "i am not A"
help(A)
```
raptor
2018-05-11 00:23:41 +08:00
不要在参数默认值中使用引用类型这难道不应该是常识?
lance6716
2018-05-11 00:54:54 +08:00
为什么要钻牛角尖…正常情况下根本不会出现这种代码
aice114
2018-05-11 00:57:47 +08:00
默认参数使用引用类型就是这样,以前看过一本 python 书还举了例子
binux
2018-05-11 01:01:48 +08:00
@raptor #4 还真不是常识,比如 JS 就不是这样的。
vegito2002
2018-05-11 02:14:51 +08:00
我觉得这个还挺有意思的.
OldPanda
2018-05-11 02:55:06 +08:00
@raptor 所谓的常识都是这样踩坑踩出来的
aijam
2018-05-11 04:25:10 +08:00
这是 python 的知名坑
FrankFang128
2018-05-11 04:28:49 +08:00
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-05-11 04:44:04 +08:00
@FrankFang128 这句话写的看起来有歧义
aipansiyouyun
2018-05-11 07:12:10 +08:00
又一个标题党
ryuzaki113
2018-05-11 08:46:11 +08:00
这个属于 Python 的坑,基本上都会踩到
mimzy
2018-05-11 09:00:21 +08:00
通常推荐使用 None 代替。基本上每个 Python 教程都会提到这个问题 比如官方入门:

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

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

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

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

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

© 2021 V2EX