函数定义中的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解释器第一次看到函数定

我对下面的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,谢谢您的链接。但这确实令人困惑,我想知道他们为什么决定这样做