0

当我查看 Python 中 += 运算符的含义时,我查看了一个类似问题的答案:+= 在 python 中到底做了什么?. 但在下面的代码摘录中:

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

使用了第三个变量。如果我理解这个概念,它会减去arr[i]并将arr[i-1]其添加到increments的值,然后将结果分配给increments. 详细说明:上面的语句是否类似于

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

还是还有更多?

4

2 回答 2

2

文档中

扩充赋值计算目标(与普通赋值语句不同,不能解包)和表达式列表,对两个操作数执行特定于赋值类型的二元运算,并将结果分配给原始目标。目标只评估一次。

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

与正常作业不同,扩充作业先评估左侧,然后再评估右侧。例如,a[i] += f(x)首先查找a[i],然后计算f(x)并执行加法,最后将结果写回a[i]

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

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

(我在第二段中强调)

所以是的,它不仅仅是increments = increments + (arr[i-1] - arr[i]). 它的重要性取决于您将运算符应用于什么。

于 2017-09-17T11:47:56.027 回答
0

详细说明:上面的语句是否类似于

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

这取决于“增量”的类型。

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

  1. 其中类型是可变的 += 执行就地修改,而 + 创建一个新对象。
  2. 对于列表 += 比 + 更灵活,+ 将只接受另一个列表,但 += 将接受任何可迭代的。

数字是不可变的,因此对于数字,这两个语句的行为相同。然而,有趣的是,看看我们是否能找出它们行为不同的一些情况。

我们可以使用的类型非常有限,因为相对较少的类型同时支持“+”和“-”,并且大多数类型只支持具有相同类型的操作。将增量列表和 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”和“increments”都受到影响。

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))

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

于 2018-06-03T00:58:02.280 回答