python元组的内部结构[重复]

2023-11-26

>>> a=1
>>> b=1
>>> id(a)
140472563599848
>>> id(b)
140472563599848
>>> x=()
>>> y=()
>>> id(x)
4298207312
>>> id(y)
4298207312
>>> x1=(1)
>>> x2=(1)
>>> id(x1)
140472563599848
>>> id(x2)
140472563599848

直到这一点我一直在想,只有一个不可变对象的副本,并且将由所有变量共享(指向)。

但当我尝试时,下面的步骤我明白我错了。

>>> x1=(1,5)
>>> y1=(1,5)
>>> id(x1)
4299267248
>>> id(y1)
4299267320

谁能向我解释一下内部结构吗?


>>> x1=(1)
>>> x2=(1)

实际上是一样的

>>> x1=1
>>> x2=1

在Python中,较小的数字被内部缓存。所以它们不会在内存中被多次创建。因此ids of x1 and x2到目前为止都是一样的。

单元素元组末尾应有一个逗号,如下所示

>>> x1=(1,)
>>> x2=(1,)

当您执行此操作时,将构造两个新元组,其中仅包含一个元素。尽管元组内的元素相同,但它们都是不同的元组。这就是为什么他们都有不同的ids.

让我们以最后一个示例为例并反汇编代码。

compiled_code = compile("x1 = (1, 5); y1 = (1, 5)", "string", "exec")

Now,

import dis
dis.dis(compiled_code)

会产生这样的东西

  1           0 LOAD_CONST               3 ((1, 5))
              3 STORE_NAME               0 (x1)
              6 LOAD_CONST               4 ((1, 5))
              9 STORE_NAME               1 (y1)
             12 LOAD_CONST               2 (None)
             15 RETURN_VALUE

它加载一个由索引引用的常量值3,即(1, 5)然后将其存储在x1。同样的方式,它在索引处加载另一个常量值4并将其存储在y1。如果我们查看代码对象中的常量列表,

print(compiled_code.co_consts)

会给

(1, 5, None, (1, 5), (1, 5))

位置上的元素3 and 4是我们在实际代码中创建的元组。因此,Python 不会为每个不可变对象只创建一个实例,always。这是一个我们不必太担心的实现细节。

Note:如果你只想拥有一个不可变对象的一个​​实例,你可以像这样手动完成

x1 = (1, 5)
x2 = x1

现在,两者x2 and x1将引用相同的元组对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python元组的内部结构[重复] 的相关文章

随机推荐