在教程中,这个例子清楚地展示了列表是通过引用传递的,所以在函数中对列表的任何修改都会在函数结束后反映在原始值中。
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显然是在函数开始之前定义的,也可以在函数本身中修改)。
2条答案
按热度按时间pkbketx91#
这是因为使用操作符
=
赋值并不改变底层对象,而是将一个python对象赋值给一个新的变量名(可能覆盖或遮盖它)。如果你使用
=
而不是.append()
,你也可以对列表有同样的行为:看到
b
为什么总是一个长度为1的列表了吗?这是因为我在函数的作用域内局部地重新赋值了b
,当我离开函数时,这个赋值就会消失,所以当我再次输入它时,它会重用全局空列表,这个列表没有被修改,当你使用append
的时候,你可以修改底层的python对象,当我使用=
的时候,我给表达式的结果赋了一个新的局部变量(在b + [a]
的例子中,它是一个全新的python对象)。最后一点,一些python对象,如数字或字符串是 * 不可变的 *。也就是说,与list不同,内存中分配的python对象不能改变。因此,操纵它们的唯一方法是创建一个新对象,该对象可以使用操作符
=
赋值。因此,没有真实的的方法来修改调用者传递的变量,从而影响调用者。3duebb1j2#
因为
b
是不可变的,当你试图赋值一个新值时,它不会改变现有的值,而是将变量重新赋值给一个新的number对象。