This puzzled me, so I played around with it a bit (Python 3.8.3):

n = []
for i in range(3):
    n.append((1,7,-3,None,"x"))
for i in range(3):
    n.append((1,7,-3,None,"x"))
print([id(x) for x in n])

a = 4
n = []
for i in range(3):
    n.append((1,7,-3,a,None,"x"))
for i in range(3):
    n.append((1,7,-3,a,None,"x"))
print([id(x) for x in n])

Output:

[27164832, 27164832, 27164832, 27164832, 27164832, 27164832]
[30065208, 30065496, 30237192, 30239976, 30240024, 30343928]

Evidently the compiler is clever enough to pick out a constant tuple and create (or cause to get created) a single instance of it which is used when required.  Indeed disassembling the code shows that LOAD_CONST is used to get the tuple.  But it obviously can't do that when the tuple contains a variable.
Rob Cliffe


On 14/06/2021 20:35, Chris Angelico wrote:
On Tue, Jun 15, 2021 at 5:12 AM Jach Feng <jf...@ms4.hinet.net> wrote:
n = [(1,2) for i in range(3)]
n
[(1, 2), (1, 2), (1, 2)]
id(n[0]) == id(n[1])  == id(n[2])
True
This is three tuples. Tuples are immutable and you get three
references to the same thing.

m = [[1,2] for i in range(3)]
m
[[1, 2], [1, 2], [1, 2]]
id(m[0]) == id(m[1])  == id(m[2])
False
These are lists. Each one is distinct. You could change one of them
and the other two would remain as they are.

ChrisA

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to