关于python列表初始化的有趣的事情

Lum*_*miG 5 python list

我很安静,因为下面用python来解决这个问题

>>> a = [[]]*3
>>> c=[[],[],[]]
>>> a
[[], [], []]
>>> c
[[], [], []]
>>> a == c
True
>>> a[1].append(2)
>>> a
[[2], [2], [2]]
>>> c[1].append(2)
>>> c
[[], [2], []]
Run Code Online (Sandbox Code Playgroud)

我猜的原因是在变量a中,所有三个列表都会向相同的内存区域发送,直到它们以不同的方式使用.这样对吗?使用*运算符之类的东西进行初始化时,我是否应该始终小心?谢谢!

iCo*_*dez 6

要回答您的问题,让我们看一下列表中项目的ID:

>>> a = [[]]*3
>>> # The ids are the same
>>> id(a[0])
28340352
>>> id(a[1])
28340352
>>> id(a[2])
28340352
>>>
Run Code Online (Sandbox Code Playgroud)

如您所见,a = [[]]*3创建一个列表,其中包含对同一列表对象的三个引用.因此,修改一个将不可避免地修改它们.

关于其他方法:

>>> c=[[],[],[]]
>>> # The ids are different
>>> id(c[0])
28340632
>>> id(c[1])
28327248
>>> id(c[2])
28299216
>>>
Run Code Online (Sandbox Code Playgroud)

如上所示,c=[[],[],[]]创建一个包含三个唯一列表对象的列表.意思是,你可以修改一个而不修改其他的.