Python 范围(3)内i的[[]]*3和[[]之间的差异

Python 范围(3)内i的[[]]*3和[[]之间的差异,python,list,Python,List,我已经使用Python好几年了,但刚刚注意到一件非常令人困惑的事情 a=[[]]*3 a[0].append(3) 及 即使类型(列表)相同,也不具有相同的效果。 第一个生成a=[[3]、[3]、[3]],第二个生成a=[[3]、[]]、[](如预期的那样) 有人有解释吗?[[]]*3创建一个列表,其中包含对同一列表对象的三个引用: >>> lst = [[]]*3 >>> # The object ids of the lists in 'lst' are

我已经使用Python好几年了,但刚刚注意到一件非常令人困惑的事情

a=[[]]*3
a[0].append(3)

即使类型(列表)相同,也不具有相同的效果。 第一个生成
a=[[3]、[3]、[3]]
,第二个生成
a=[[3]、[]]、[]
(如预期的那样)


有人有解释吗?

[[]]*3
创建一个列表,其中包含对同一列表对象的三个引用:

>>> lst = [[]]*3
>>> # The object ids of the lists in 'lst' are the same
>>> id(lst[0])
25130048
>>> id(lst[1])
25130048
>>> id(lst[2])
25130048
>>>
[[]用于范围(3)中的i]
创建一个包含三个唯一列表对象的列表:

>>> lst = [[] for i in range(3)]
>>> # The object ids of the lists in 'lst' are different
>>> id(lst[0])
25131768
>>> id(lst[1])
25130008
>>> id(lst[2])
25116064
>>>

[[]]*3
创建一个列表,其中包含对同一列表对象的三个引用:

>>> lst = [[]]*3
>>> # The object ids of the lists in 'lst' are the same
>>> id(lst[0])
25130048
>>> id(lst[1])
25130048
>>> id(lst[2])
25130048
>>>
[[]用于范围(3)中的i]
创建一个包含三个唯一列表对象的列表:

>>> lst = [[] for i in range(3)]
>>> # The object ids of the lists in 'lst' are different
>>> id(lst[0])
25131768
>>> id(lst[1])
25130008
>>> id(lst[2])
25116064
>>>

这很有道理,谢谢!这很有道理,谢谢!这么多的复制品…@jornsharpe这是如此接近于一个精确的复制品,简直让我震惊!问题是关于复制品。这是一个元复制品?@wim,也许吧,但是你如何寻找它们呢?根据复制品的精神,这里有3个。。。这么多的复制品…@jornsharpe这是如此接近于一个精确的复制品,简直让我震惊!问题是关于复制品。这是一个元复制品?@wim,也许吧,但是你如何寻找它们呢?根据复制品的精神,这里有3个。。。