【问题标题】:Difference between assignment and compound operators in Python [duplicate]Python中赋值运算符和复合运算符之间的区别[重复]
【发布时间】:2017-12-25 05:11:41
【问题描述】:

请看下面的代码

def double(arg):
    print("Before: ", arg)
    arg = arg * 2
    print("After: ", arg)

我在学习 Head first 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 是一样的。但是这里发生了什么?

谢谢

【问题讨论】:

标签: python python-3.x


【解决方案1】:

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

(见this question

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 2011-11-16
      • 2010-12-30
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多