Python默认值仅计算一次

ztmd8pv5  于 2023-03-16  发布在  Python
关注(0)|答案(2)|浏览(155)

在教程中,这个例子清楚地展示了列表是通过引用传递的,所以在函数中对列表的任何修改都会在函数结束后反映在原始值中。

def fun1(a,L=[]):
    L.append(a)
    return L

print fun1(1)
print fun1(2)
print fun1(3)

[1]
[1, 2]
[1, 2, 3]

然而,如果我尝试这个例子,为什么B没有改变(iIndieE.如果b存储为“2”,那么它应该返回3)?

def g(a, b=1):
    b=a+b
    return b

>>> g(1)
    2
>>> g(1)
    2

我猜这是因为语句b = a+b将b赋值给了一个只能在函数环境中访问的新b,但这与第一个例子的工作原理是不是不一致(在第一个例子中,变量L显然是在函数开始之前定义的,也可以在函数本身中修改)。

pkbketx9

pkbketx91#

这是因为使用操作符=赋值并不改变底层对象,而是将一个python对象赋值给一个新的变量名(可能覆盖或遮盖它)。
如果你使用=而不是.append(),你也可以对列表有同样的行为:

>>> def g2(a, b=[]):
...   b = b + [a]
...   return b
...
>>> g2(1)
[1]
>>> g2(4)
[4]
>>> g2(5)
[5]

看到b为什么总是一个长度为1的列表了吗?这是因为我在函数的作用域内局部地重新赋值了b,当我离开函数时,这个赋值就会消失,所以当我再次输入它时,它会重用全局空列表,这个列表没有被修改,当你使用append的时候,你可以修改底层的python对象,当我使用=的时候,我给表达式的结果赋了一个新的局部变量(在b + [a]的例子中,它是一个全新的python对象)。
最后一点,一些python对象,如数字或字符串是 * 不可变的 *。也就是说,与list不同,内存中分配的python对象不能改变。因此,操纵它们的唯一方法是创建一个新对象,该对象可以使用操作符=赋值。因此,没有真实的的方法来修改调用者传递的变量,从而影响调用者。

3duebb1j

3duebb1j2#

因为b是不可变的,当你试图赋值一个新值时,它不会改变现有的值,而是将变量重新赋值给一个新的number对象。

相关问题