gpt4 book ai didi

python - python 元组的内部结构

转载 作者:太空狗 更新时间:2023-10-29 18:05:23 24 4
gpt4 key购买 nike

>>> 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

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

但是当我尝试以下步骤时,我明白我错了。

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

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

最佳答案

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

其实和

是一样的
>>> x1=1
>>> x2=1

在 Python 中,smaller numbers are internally cached .所以它们不会在内存中多次创建。这就是为什么 x1x2id 到目前为止是相同的。

单元素元组的末尾应该有一个逗号,就像这样

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

执行此操作时,将构建两个新元组,其中只有一个元素。尽管元组中的元素相同,但它们都是不同的元组。这就是为什么它们都有不同的 id

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

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

现在,

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))

位置34 的元素是我们在实际代码中创建的元组。因此,Python 不会为每个不可变对象(immutable对象)只创建一个实例,总是。它是一个实现细节,无论如何我们都不必太担心。

注意:如果你只想拥有一个不可变对象(immutable对象)的实例,你可以像这样手动完成

x1 = (1, 5)
x2 = x1

现在,x2x1 将引用同一个元组对象。

关于python - python 元组的内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27459663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com