在将其分配给第三个变量时,在Python中为+ =

时间:2017-09-17 11:43:08

标签: python compound-assignment

当我在Python中查看+ =运算符的含义时,我查看了类似问题的答案:What exactly does += do in python?。但在下面的代码摘录中:

increments += arr[i-1] - arr[i]

使用了第三个变量。如果我理解了该概念,则会从arr[i]中减去arr[i-1]并将其添加到increments的值,并将结果分配给increments。详细说明:以上语句与

类似
increments = increments + (arr[i-1] - arr[i])

还是还有更多吗?

2 个答案:

答案 0 :(得分:2)

来自the documentation

  

增强赋值评估目标(与正常赋值语句不同,它不能是解包)和表达式列表,执行特定于两个操作数上赋值类型的二进制运算,并将结果赋给原始目标。目标仅评估一次。

     

可以将x += 1这样的扩充分配表达式重写为x = x + 1,以实现相似但不完全相等的效果。在增强版本中,x仅评估一次。此外,在可能的情况下,实际操作是就地执行的,这意味着不是创建新对象并将其分配给目标,而是修改旧对象。

     

与正常分配不同,增强分配在评估右侧之前评估左侧。例如,a[i] += f(x)首先查找a[i],然后评估f(x)并执行添加,最后,它将结果写回a[i]

     

除了在单个语句中分配元组和多个目标之外,由扩充赋值语句完成的赋值的处理方式与正常赋值相同。类似地,除了可能的就地行为之外,通过扩充赋值执行的二进制操作与普通二进制操作相同。

     

对于属性引用的目标,关于类和实例属性的相同警告适用于常规分配。

(我在第二段的重点)

是的,除此之外还有increments = increments + (arr[i-1] - arr[i])。重要程度取决于您将操作员应用于何处。

答案 1 :(得分:0)

  

详细说明:上述陈述与

类似      

增量=增量+(arr [i-1] - arr [i])

这取决于"增量的类型"。

关于核心内置类型(以及尝试遵循它们设置的模式的其他类型),+和+ =之间至少存在两个显着差异。

  1. 类型是可变的+ =在原地执行修改而+创建新对象。
  2. 对于列表+ =比+更灵活,+只接受另一个列表,但+ =将接受任何可迭代。
  3. 数字是不可变的,因此对于数字,两个语句的行为相同。然而,有趣的是看看我们是否能够找出一些行为不同的情况。

    我们可以使用的类型非常有限,因为相对较少的类型同时支持" +"和" - "大多数类型仅支持相同类型的操作。将增量作为列表并制作arr集的元素的组合是证明差异的一种方式。

    increments=[]
    i = 1 
    arr=[{"foo","bar"},{"bar","baz"}]
    increments += arr[i-1] - arr[i]
    print(increments)
    

    "打印[' foo']"

    increments=[]
    i = 1 
    arr=[{"foo","bar"},{"bar","baz"}]
    increments = increments + (arr[i-1] - arr[i])
    print(increments)
    

    引发异常" TypeError:只能连接列表(不是"设置")到列表"

    但这是一个相当人为的例子,对于更现实的东西,我们想要一种可变的类型并支持" +"和" - "。我不认为核心内置类型中有任何类型,但一种广泛使用的类型是"数组"从numpy中输入。

    from numpy import array
    increments=array((1,2))
    oldincrements=increments
    i = 1 
    arr=[array((3,4)),array((5,6))]
    increments += arr[i-1] - arr[i]
    print(repr(oldincrements)+' '+repr(increments))
    

    打印"数组([ - 1,0])数组([ - 1,0])"。 numpy数组已就地修改,因此" oldincrements"和"增量"受到影响。

    from numpy import array
    increments=array((1,2))
    oldincrements=increments
    i = 1 
    arr=[array((3,4)),array((5,6))]
    increments = increments + (arr[i-1] - arr[i])
    print(repr(oldincrements)+' '+repr(increments))
    

    打印"数组([1,2])数组([ - 1,0])"由增量指向的数组未就地修改,而是创建了一个新数组并将其分配给"增量"。所以" oldincrements"没有受到影响。