详细说明:上面的语句是否类似于
增量 = 增量 + (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”和“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])”,增量指向的数组没有就地修改,而是创建了一个新数组并将其分配给“增量”。所以“旧增量”没有受到影响。