我对以下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=[]
答案 0 :(得分:1)
默认值在功能定义时绑定。将字典或列表指定为默认值时,这是一个常见的“问题”。
有关其他详细信息,请参阅this blog post,其中包含有关可变默认值的部分。
当python解释器首次看到函数定义时,您可以将其视为创建对象并将其绑定到形式参数名称。从那时起,当调用该函数时,如果没有用户提供的值,则向该函数提供相同的可变对象。
一开始肯定是一个惊喜,但适合python做事的方式。
答案 1 :(得分:1)
因为它在函数定义中创建一个空列表,并将对该对象的引用设置为默认参数。此默认引用始终指向同一对象。