当我在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])
还是还有更多吗?
答案 0 :(得分:2)
增强赋值评估目标(与正常赋值语句不同,它不能是解包)和表达式列表,执行特定于两个操作数上赋值类型的二进制运算,并将结果赋给原始目标。目标仅评估一次。
可以将
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])
这取决于"增量的类型"。
关于核心内置类型(以及尝试遵循它们设置的模式的其他类型),+和+ =之间至少存在两个显着差异。
数字是不可变的,因此对于数字,两个语句的行为相同。然而,有趣的是看看我们是否能够找出一些行为不同的情况。
我们可以使用的类型非常有限,因为相对较少的类型同时支持" +"和" - "大多数类型仅支持相同类型的操作。将增量作为列表并制作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"没有受到影响。