为了账号安全,请及时绑定邮箱和手机立即绑定

Python列表乘法:[[...]] * 3使3个列表在修改时相互镜像

Python列表乘法:[[...]] * 3使3个列表在修改时相互镜像

千巷猫影 2019-07-31 10:04:02
Python列表乘法:[[...]] * 3使3个列表在修改时相互镜像为什么会这样?我真的不明白:>>> P = [ [()]*3 ]*3>>> P[[(), (), ()], [(), (), ()], [(), (), ()]]>>> P[0][0]=1>>> P[[1, (), ()], [1, (), ()], [1, (), ()]]
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

您已对同一列表进行了3次引用。

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

你想这样做:

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


查看完整回答
反对 回复 2019-07-31
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

你也可以像这样写它,它具有显示结构的优点 [[()]*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 loopIn [2]: timeit P=[i[:] for i in [[()]*3]*3]1000000 loops, best of 3: 1.27 us per loop


查看完整回答
反对 回复 2019-07-31
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 576 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信