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