Python 列表乘法:[[...]]*3 生成 3 个列表,修改后它们互为镜像[重复]
- 2025-02-27 09:06:00
- admin 原创
- 62
问题描述:
为什么会这样?我不太明白:
>>> P = [ [()]*3 ]*3
>>> P
[[(), (), ()], [(), (), ()], [(), (), ()]]
>>> P[0][0]=1
>>> P
[[1, (), ()], [1, (), ()], [1, (), ()]]
解决方案 1:
您已 3 次引用同一份列表。
>>> a = b = []
>>> a.append(42)
>>> b
[42]
你想这样做:
P = [[()] * 3 for x in range(3)]
解决方案 2:
列表是可变的,将列表乘以数字不会复制其元素。您可以尝试将其更改为列表推导式,这样它将求值[()]*3
三次,从而创建三个不同的列表:
P = [ [()]*3 for i in range(3) ]
解决方案 3:
它实际上是重复了 3 次的相同内部列表(相同引用),因此当您修改其中任何一个时,实际上是在修改所有它们。
因此,内部列表[()]*3
生成一个包含三个元组的列表。但随后这个列表被复制了三次。然而,在 Python 中,它实际上是一个被乘以的引用列表,因此引用被复制,但每个引用仍然指向相同的底层列表。
解决方案 4:
你也可以这样写,这样做的好处是可以展示结构[[()]*3]*3
>>> P=[i[:] for i in [[()]*3]*3]
>>> P[0][0]=1
>>> P
[[1, (), ()], [(), (), ()], [(), (), ()]
它也比使用 range 稍快一些。从 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
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD