我打开了我的python解释器,编码并运行以下函数。
>>> def crazy_function(my_list=[]):
... my_list.append(0)
... return my_list
...
>>> crazy_function()
[0]
>>> crazy_function()
[0, 0]
>>> crazy_function()
[0, 0, 0]
>>> crazy_function()
[0, 0, 0, 0]
>>> crazy_function()
[0, 0, 0, 0, 0]
>>> crazy_function()
[0, 0, 0, 0, 0, 0]
>>> crazy_function()
[0, 0, 0, 0, 0, 0, 0]
>>>
发生了什么事?为什么函数返回的列表越长,我调用函数越多?每次调用函数时都不应该创建新的本地列表吗?
答案 0 :(得分:2)
将可变对象分配给函数参数的默认值是一个常见错误。引用documentation:
在函数定义时计算默认参数值 执行。这意味着当表达式被评估一次 定义函数,并使用相同的“预先计算”值 每次通话。这对了解何时来说尤为重要 default参数是一个可变对象,例如列表或字典: 如果函数修改了对象(例如通过将项附加到a 列表),默认值实际上已修改。这通常不是 是什么意思。