Chris Angelico 在 2021年6月15日 星期二上午5:23:12 [UTC+8] 的信中寫道: > On Tue, Jun 15, 2021 at 7:11 AM Rob Cliffe via Python-list > <pytho...@python.org> wrote: > > > > 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. > Correct. In theory, Python could intern the tuples (as can be done > with strings), noticing that it's constructing one that is identical > to one it already has, but the effort of doing that is hard to > justify. Simpler to just build a brand new tuple every time. > > ChrisA From a user's point, I don't really care how Python creates those instances, either using an already exist one or create a new one, as long as each element (and its sub-element) are independent from each other so a modification of one will not influence the other. The real problem is there are different methods can be used to build it and some will fail in this purpose. The * operator is one of them, but anyone else? I really like to know:-)
--Jach -- https://mail.python.org/mailman/listinfo/python-list