我很安静地想用下面的python来解决这个问题
>>> a = [[]]*3
>>> c=[[],[],[]]
>>> a
[[], [], []]
>>> c
[[], [], []]
>>> a == c
True
>>> a[1].append(2)
>>> a
[[2], [2], [2]]
>>> c[1].append(2)
>>> c
[[], [2], []]
我猜的原因是在变量a中,所有三个列表都以相同的内存区域发送,直到它们以不同的方式使用。这样对吗?使用*运算符之类的东西进行初始化时,我是否应该始终小心?谢谢!
答案 0 :(得分:6)
要回答您的问题,请查看列表中项目的ID:
>>> a = [[]]*3
>>> # The ids are the same
>>> id(a[0])
28340352
>>> id(a[1])
28340352
>>> id(a[2])
28340352
>>>
如您所见,a = [[]]*3
创建了一个包含三个引用的列表到同一个列表对象。因此,修改一个将不可避免地修改它们。
关于另一种方法:
>>> c=[[],[],[]]
>>> # The ids are different
>>> id(c[0])
28340632
>>> id(c[1])
28327248
>>> id(c[2])
28299216
>>>
如上所示,c=[[],[],[]]
创建一个包含三个唯一列表对象的列表。意思是,你可以修改一个而不修改其他的。
答案 1 :(得分:4)
>>> a = [ [ ] ]*3
上面的代码在一个列表中创建了3个列表。请注意,您没有提及列表中列表的任何限制。在这里,您将内部创建的列表数量限制为3.因此,如果您使用问题中提到的附加语句,那么您可以在该单个列表中包含3个无限列表,并且每个列表内部都是相同的。
>>> c=[ [ ],[ ],[ ] ]
此代码将创建一个包含三个列表的列表,每个列表中包含一个元素。外部列表的限制设置为3,内部列表设置为1。在这里,您可以通过明确提及问题中的位置来附加到列表中。
答案 2 :(得分:3)
使用a
,您实际上是在创建一个列表并显示相同列表 3次。
a
中的这3个列表中的每一个都类似于引用到内存中的相同列表。
因此,当您更改a
中的任何列表时,您都会更改所有列表,因为它们是相同的列表。
使用c
,您将明确创建3个不同的列表。
改变一个不会改变其他人。
因此,你看到的行为。