【问题标题】:Python function parameters [duplicate]Python函数参数[重复]
【发布时间】:2020-09-13 01:06:00
【问题描述】:
这个:
def f(i,values = [99]):
values.append(i)
print (values)
f(1)
f(2)
有这个结果:
[99, 1]
[99, 1, 2]
为什么每次调用函数时都没有将values(重新)设置为[99]?
我还以为是这样的:
def f(i):
values = [99]
values.append(i)
print (values)
f(1)
f(2)
【问题讨论】:
标签:
python
list
function
scope
【解决方案1】:
因为列表是可变的。
传递给函数的参数绑定到对象,对象可以是可变的(如列表)或不可变的(如 Python 中的整数、字符串)。
与不可变类型(例如整数,在您的情况下 i 是第一个参数)不同,可变对象可以更改,事实上,每次您调用函数 f() 时,默认参数 values 都会发生突变。
所以发生的事情是,您首先定义了values=[99],而Python 将默认值[99]“保留”给函数
现在有了values.append(i),它正在函数内部发生变异(values 更改为[99,1],它也被作为默认值变异。
在documentation 中,明确表示在可变对象的情况下the default value is in effect modified
默认参数值是从左到右计算的,当
函数定义被执行。这意味着表达式是
在定义函数时评估一次,并且相同
“预计算”值用于每次调用。这尤其
了解默认参数何时是可变对象很重要,
例如列表或字典:如果函数修改了对象
(例如,通过将项目附加到列表中),默认值有效
修改的。这通常不是预期的。解决这个问题的方法
就是使用 None 作为默认值,并在正文中显式测试它
函数,例如:
可变值在某些情况下可能非常糟糕,对于默认值,请勿使用可变默认参数,除非绝对必要