函数定义中的Python变量范围
我对下面的Python代码感到非常惊讶函数定义中的Python变量范围,python,variables,scope,Python,Variables,Scope,我对下面的Python代码感到非常惊讶 def f(x,l=[]): for i in range(x): l.append(i*i) print(l) f(2) #[0, 1] f(3) #[0, 1, 0, 1, 4] 问题是为什么Python使用相同的l列表,而函数定义中总是定义为l=[]在函数定义时绑定默认值。当将字典或列表指定为默认值时,这是一个常见的“问题” 有关其他详细信息,请参见,其中有一节介绍可变默认值 当python解释器第一次看到函数定
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)
f(2) #[0, 1]
f(3) #[0, 1, 0, 1, 4]
问题是为什么Python使用相同的
l
列表,而函数定义中总是定义为l=[]
在函数定义时绑定默认值。当将字典或列表指定为默认值时,这是一个常见的“问题”
有关其他详细信息,请参见,其中有一节介绍可变默认值
当python解释器第一次看到函数定义时,可以将其视为创建对象并将其绑定到形式参数名。从那时起,当调用函数时,如果不存在用户提供的值,则向函数提供相同的可变对象
一开始这当然是一个惊喜,但它符合python的工作方式。因为它在函数定义处创建一个空列表,并将对该对象的引用设置为默认参数。此默认引用始终指向同一对象。这是一个常见的dup;给我一点时间来找到标准答案。Python常见问题解答中也对其进行了解释。@eqwert,谢谢您的链接。但这确实令人困惑,我想知道他们为什么决定这样做