函数多次运行时,默认参数中嵌套了列表,但整数不是

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