my_list = [[1]*4] * 3
创建一个列表对象 [1,1,1,1]
并将其引用复制 3 次。这相当于 obj = [1,1,1,1]; my_list = [obj]*3
。对 的任何修改 obj
都将反映在 obj
列表中引用 的三个地方。正确的语句应该是:
my_list = [[1]*4 for _ in range(3)]
或者
my_list = [[1 for __ in range(4)] for _ in range(3)]
这里要注意的重要一点 是, *
运算符 主要 用于创建 文字列表 。虽然 1
是不可变的,但 obj = [1]*4
仍然会创建一个 1
重复 4 次的列表以形成 [1,1,1,1]
。但是,如果对不可变对象进行了任何引用,则该对象将被新对象覆盖。
这意味着如果我们这样做 obj[1] = 42
,那么 obj
不再 [1,42,1,1]
变成 [42,42,42,42]
。这也可以得到验证:
>>> my_list = [1]*4
>>> my_list
[1, 1, 1, 1]
>>> id(my_list[0])
4522139440
>>> id(my_list[1]) # Same as my_list[0]
4522139440
>>> my_list[1] = 42 # Since my_list[1] is immutable, this operation overwrites my_list[1] with a new object changing its id.
>>> my_list
[1, 42, 1, 1]
>>> id(my_list[0])
4522139440
>>> id(my_list[1]) # id changed
4522140752
>>> id(my_list[2]) # id still same as my_list[0], still referring to value `1`.
4522139440