首页 > 解决方案 > 增强分配操作何时表现为就地操作,何时不表现为?

问题描述

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

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

标签: pythonin-placeaugmented-assignment

解决方案


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

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

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

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


推荐阅读