Python的多维列表排坑

Python贵为脚本神器,稍不注意也会被撞一下腰。
写分析脚本的时候发现一个问题,当试图创建一个二维列表时如果使用

data_sec = [[]] * 4

的方式,建立一个不固定列,4行的二维列表,解释器不会报错。然而,当像C语言一样对第一行(即四个列表中的第一个列表)写入时,假如写入的方式和内容是

data_sec[0].append('ab')
data_sec[0].append('bb')
data_sec[0].append('cb')

看起来只是对第一行列表赋值,但实际上打印出来会发现

print(data_sec)
>>> [['ab', 'bb', 'cb'], ['ab', 'bb', 'cb'], ['ab', 'bb', 'cb']]

所有的元素都被赋值了。此时如果

data_sec[1].append('db')
print(data_sec)
>>>[['ab', 'bb', 'cb', 'db'], ['ab', 'bb', 'cb', 'db'], ['ab', 'bb', 'cb', 'db']]

原因出现在初始化语句data_sec = [[]] * 4。像这样初始化的方式,python默认data_sec的每一个行列表都是相互的引用。因此修改其中一行,其他行也会跟着变化。官方解释在此。
解决的办法是使用这样的方式初始化

w, h = 2, 3
A = [[None] * w for i in range(h)]

或者简单一点,不限定列数

A = [[] for i in range(y)]
Comments
Write a Comment
'