Python可变默认参数
示例
def foo(li=[]):
li.append(1)
print(li)
foo([2])
#出:[2,1]
foo([3])
#出:[3,1]该代码的行为符合预期,但是如果我们不传递参数怎么办?
foo() #出:[1]符合预期... foo() #出:[1,1]与预期不符...
这是因为函数和方法的默认参数是在定义时而不是运行时求值的。因此,我们只有一个li列表实例。
解决方法是对默认参数仅使用不可变类型:
def foo(li=None):
if not li:
li = []
li.append(1)
print(li)
foo()
#出:[1]
foo()
#出:[1]尽管改进并且可以ifnotli正确评估为False,但许多其他对象也可以这样做,例如零长度序列。以下示例参数可能会导致意外的结果:
x = [] foo(li=x) #出:[1] foo(li="") #出:[1] foo(li=0) #出:[1]
惯用的方法是直接检查None对象的参数:
def foo(li=None):
if li is None:
li = []
li.append(1)
print(li)
foo()
#出:[1]
热门推荐
1 泰迪狗狗如何训练
3 狗狗训练图
5 狗狗训练方法
6 训练狗狗不咬人
8 敏捷训练狗狗
10 训练狗狗吃饭
11 泰迪狗狗训练
12 狗狗从多大开始训练
13 狗狗训练学校费用
14 怎么去训练狗狗
15 狗狗训练狗狗
16 狗狗训练教程
17 训练狗狗装死
18 泰迪狗狗的训练方法