函数多次运行时,默认参数中嵌套了列表,但整数不是
When the function runs multiple times, the list is nested in the default parameter, but the integer is not
列表x
并不是每次函数运行时都初始化为参数默认值,而是保持之前的状态并添加新值。
就这样函数执行了5次,所以变成了[7, 7, 7, 7, 7]
。
但是,整数 y 似乎包含默认值。已经运行5次了,但是还是继续输出2
。
为什么y
函数执行5次最后输出的是2
而不是6
?
我已经读过 this question,但它解释了列表绑定到函数的位置。但是我想知道为什么这个原则不适用于整数默认参数。
def foo(x=[],y=1):
x.append(7)
y += 1
return x, y
print(foo())
print(foo())
print(foo())
print(foo())
print(foo())
([7], 2)
([7, 7], 2)
([7, 7, 7], 2)
([7, 7, 7, 7], 2)
([7, 7, 7, 7, 7], 2)
Int 是不可变的,列表不是。当您为参数分配默认值时,您正在为该值分配一个引用。执行y += 1
实际上是创建了一个新的引用并赋值给y
,它并没有改变旧引用的值。当您改变容器时,您不会更改引用。示例:
y = 1
x = y
# This will be true as they have the same reference
print(x is y) # True
y += 1
# This will be false as the reference to y has been changed
print(x is y) # False
y = []
x = y
# This will be true as they have the same reference
print(x is y) # True
y.append(1)
# This will still be true, the reference to the container remains the same.
print(x is y) # True
列表x
并不是每次函数运行时都初始化为参数默认值,而是保持之前的状态并添加新值。
就这样函数执行了5次,所以变成了[7, 7, 7, 7, 7]
。
但是,整数 y 似乎包含默认值。已经运行5次了,但是还是继续输出2
。
为什么y
函数执行5次最后输出的是2
而不是6
?
我已经读过 this question,但它解释了列表绑定到函数的位置。但是我想知道为什么这个原则不适用于整数默认参数。
def foo(x=[],y=1):
x.append(7)
y += 1
return x, y
print(foo())
print(foo())
print(foo())
print(foo())
print(foo())
([7], 2)
([7, 7], 2)
([7, 7, 7], 2)
([7, 7, 7, 7], 2)
([7, 7, 7, 7, 7], 2)
Int 是不可变的,列表不是。当您为参数分配默认值时,您正在为该值分配一个引用。执行y += 1
实际上是创建了一个新的引用并赋值给y
,它并没有改变旧引用的值。当您改变容器时,您不会更改引用。示例:
y = 1
x = y
# This will be true as they have the same reference
print(x is y) # True
y += 1
# This will be false as the reference to y has been changed
print(x is y) # False
y = []
x = y
# This will be true as they have the same reference
print(x is y) # True
y.append(1)
# This will still be true, the reference to the container remains the same.
print(x is y) # True