qaz*_*wsx 9 python arguments default-value
#!/usr/bin/env python3.2
def f1(a, l=[]):
l.append(a)
return(l)
print(f1(1))
print(f1(1))
print(f1(1))
def f2(a, b=1):
b = b + 1
return(a+b)
print(f2(1))
print(f2(1))
print(f2(1))
Run Code Online (Sandbox Code Playgroud)
在f1参数中l有一个默认值赋值,它只被评估一次,所以三个print输出1,2和3.为什么f2不做类似的?
为了使我学到的东西更容易为这个帖子的未来读者导航,我总结如下:
因为在f2名称中b是反弹,而在f1对象中l是变异的.
这在一个相对流行的SO问题中有详细介绍,但我会尝试在您的特定背景下解释该问题.
声明函数时,会在此时评估默认参数.每次调用该函数时都不会刷新.
您的函数表现不同的原因是因为您对它们的处理方式不同.在f1你正在改变对象,而在f2你正在创建一个新的整数对象并将其分配b.你没有b在这里修改,你正在重新分配它.现在它是一个不同的对象.在f1,你保持相同的对象.
考虑一个替代功能:
def f3(a, l= []):
l = l + [a]
return l
Run Code Online (Sandbox Code Playgroud)
此行为类似于f2并且不会继续附加到默认列表.这是因为它创建了一个新的,l而没有修改默认参数中的对象.
python中的常见样式是分配默认参数None,然后分配新列表.这避免了整个模糊性.
def f1(a, l = None):
if l is None:
l = []
l.append(a)
return l
Run Code Online (Sandbox Code Playgroud)