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