新手请教关于 Python 函数参数默认值设计的问题

2019-06-16 23:25:11 +08:00
 palmers

举栗子:

def gen_list_with(elements = [], e=None):
    elements.append(e)
    return elements
    

rs = gen_list_with( e = 'world')

print(rs)

rs = gen_list_with(e = 'python')    
print(rs)
//输出
['world']
['world', 'python']

我疑惑的是:
1. 方法或函数的形参都是局部的,随着执行完毕,出栈后对应的执行环境都会被销毁,为什么还会出现这种情况呢?
2. 这种情况在给 elements 指定值的情况下会消除, 为什么呢? 比如:

rs = gen_list_with(elements = ['init'], e = 'world')
rs = gen_list_with(e = 'python')    
print(rs)
//输出
['python']

我只知道是因为函数形参使用了可变对象的原因, 但是为什么这么设计, 暂时还没有找到比较权威的说明,麻烦大家给解答一下, 或者给我一份官方或 python 作者这么设计的原因说明文档, 谢谢了

2875 次点击
所在节点    Python
21 条回复
annoymous
2019-06-18 14:47:44 +08:00
分不清楚的话 可以遵照上面的写法 永远返回一个 copy 保证安全

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

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

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

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

© 2021 V2EX