猿问

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

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

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


>>> P = [ [()]*3 ]*3

>>> P

[[(), (), ()], [(), (), ()], [(), (), ()]]

>>> P[0][0]=1

>>> P

[[1, (), ()], [1, (), ()], [1, (), ()]]


千巷猫影
浏览 580回答 3
3回答

jeck猫

您已对同一列表进行了3次引用。>>> a = b = []>>> a.append(42)>>> b[42]你想这样做:P = [[()] * 3 for x 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 loopIn [2]: timeit P=[i[:] for i in [[()]*3]*3]1000000 loops, best of 3: 1.27 us per loop

杨__羊羊

列表是可变的,将列表乘以数字不会复制其元素。您可以尝试将其更改为列表理解,因此它将评估[()]*3三次,创建三个不同的列表:P = [ [()]*3 for i in range(3) ]
随时随地看视频慕课网APP

相关分类

Python
我要回答