0

我一直都知道 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

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

4

2 回答 2

1

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

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

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

另一方面,var2 += [7]这表明可以重复使用相同的空间。在大多数情况下,列表上的 += 确实会重用相同的空间。

于 2020-09-15T02:34:26.170 回答
1

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

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

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

于 2020-09-15T02:36:21.380 回答