Python列表乘法:[[...]]*3通过修改可以生成3个相互镜像的列表

2024-03-29 09:50:24 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么会这样?我真的不明白:

>>> P = [ [()]*3 ]*3
>>> P
[[(), (), ()], [(), (), ()], [(), (), ()]]
>>> P[0][0]=1
>>> P
[[1, (), ()], [1, (), ()], [1, (), ()]]

3条回答

列表是可变的,将列表乘以数字不会复制其元素。您可以尝试将其更改为列表理解,这样它将评估[()]*3三次,创建三个不同的列表:

P = [ [()]*3 for i in range(3) ]

您也可以这样编写它,它的优点是显示结构[[()]*3]*3

>>> P=[i[:] for i in [[()]*3]*3]
>>> P[0][0]=1
>>> P
[[1, (), ()], [(), (), ()], [(), (), ()]

它也比使用范围稍快。来自ipython shell:

In [1]: timeit P = [ [()]*3 for i in range(3) ]
1000000 loops, best of 3: 1.41 us per loop

In [2]: timeit P=[i[:] for i in [[()]*3]*3]
1000000 loops, best of 3: 1.27 us per loop

你引用了同一个列表3次。

>>> a = b = []
>>> a.append(42)
>>> b
[42]

你想这样做:

P = [[()] * 3 for x in range(3)]

相关问题 更多 >