增强分配操作什么时候表现为就地操作,什么时候不表现



我一直知道Python增强操作总是执行就地操作。但似乎并不是每个案例都是这样。当我在integers上应用增强运算时,它还没有到位。

var1 = 1234
print(id(var1))
var1 = var1 + 4321
print(id(var1))
print()
var2 = 5678
print(id(var2))
var2 += 8765
print(id(var2))

输出:

140272195234704
140272195234928
140272195234736
140272195234896    

但当我把它应用到列表中时,它就就位了。

var1 = [1, 2]
print(id(var1))
var1 = var1 + [3]
print(id(var1))
print()
var2 = [5, 6]
print(id(var2))
var2 += [7]
print(id(var2))

输出:

140461597772992
140461597413184
140461597412480
140461597412480

我的问题是,它什么时候表现为就地操作,什么时候不表现为什么

运行var1 = var1 + [3]时,Python首先执行右侧的操作,然后将其分配给左侧的变量。它会创建一个全新的列表,其中值的结果位于右侧,然后将其分配给左侧。旧列表和新列表不同是有道理的。事实上,如果你运行:

var1 = [1, 2]
var2 = var1
var1 = var1 + [3]

var2在第二条指令之后将具有与var1相同的id,并且var2在第三条指令之后继续具有相同的id而var的id改变。

另一方面,var2 += [7]是可以重用相同空间的指示。在大多数情况下,列表上的+=确实重用了相同的空间。

使用整数,在这两种情况下都将用另一个整数替换一个整数,因为整数是不可变的。由于在这两种情况下,您都在谈论一个新对象被分配给变量,因此变量所指向的id在这两个情况下都会发生变化。

在第一个列表的情况下,您实际上在做同样的事情,用另一个列表替换一个列表,因为+运算符就是这样做的。。。它组合两个操作数列表并返回一个新列表。

但在+=的情况下,您并没有改变var2指向的列表,而是只是操纵它指向的列表。列表是可以修改的可变对象。+=运算符的作用类似于列表的extend方法,将提供的列表中的项附加到现有列表上。因为var2所指向的列表不会更改,所以id也不会更改。

最新更新