Python

时间:2017-07-19 18:55:41

标签: python python-3.x

请查看以下代码

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是相同的。但是这里发生了什么?

由于

2 个答案:

答案 0 :(得分:1)

这是可变对象和不可变对象之间的区别。可变对象可以通过实际修改对象来实现obj *= something;不可变对象只能返回具有更新值的新对象(在这种情况下,结果与obj = obj * something相同)。复合赋值语句可以处理任何一种情况,它完全取决于对象的实现。

答案 1 :(得分:1)

a * = 2修改结构本身(a)而a = a * 2将a重新指定为新变量。

(见this question