请查看以下代码
def double(arg):
print("Before: ", arg)
arg = arg * 2
print("After: ", arg)
我正在研究Head第一个Python,我来到这个部分,他们讨论了按值传递并通过引用传递。 如果我们使用列表作为参数调用上面的函数,例如:
num = [1,2,3]
double(num)
print(num)
输出结果为: -
Before: [1, 2, 3]
After: [1, 2, 3, 1, 2, 3]
[1, 2, 3]
考虑到函数double中的 arg 是一个新的对象引用,这似乎很好。因此 num 的值没有改变。
但是如果我使用复合运算符而不是赋值运算符,那么事情就会如图所示:
def double(arg):
print("Before: ", arg)
arg *= 2
print("After: ", arg)
num = [1,2,3]
double(num)
print(num)
我得到的输出是:
Before: [1, 2, 3]
After: [1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3]
为什么会这样?我曾经认为a * = 2和a = a * 2是相同的。但是这里发生了什么?
由于
答案 0 :(得分:1)
这是可变对象和不可变对象之间的区别。可变对象可以通过实际修改对象来实现obj *= something
;不可变对象只能返回具有更新值的新对象(在这种情况下,结果与obj = obj * something
相同)。复合赋值语句可以处理任何一种情况,它完全取决于对象的实现。
答案 1 :(得分:1)
a * = 2修改结构本身(a)而a = a * 2将a重新指定为新变量。