>>> x1=(1)
>>> x2=(1)
实际上是一样的
>>> x1=1
>>> x2=1
在Python中,较小的数字被内部缓存。所以它们不会在内存中被多次创建。因此id
s of x1
and x2
到目前为止都是一样的。
单元素元组末尾应有一个逗号,如下所示
>>> x1=(1,)
>>> x2=(1,)
当您执行此操作时,将构造两个新元组,其中仅包含一个元素。尽管元组内的元素相同,但它们都是不同的元组。这就是为什么他们都有不同的id
s.
让我们以最后一个示例为例并反汇编代码。
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
将引用相同的元组对象。