我花了半天时间寻找一个可以归结为以下嵌套列表分配行为的bug(对比list_append vs list_assign):
list_append = []
list_assign = [ [None]*3 ]*4
for iseg1 in range(4):
list_run = []
for iseg2 in range(3):
list_run.append(10*iseg1+iseg2)
list_assign[iseg1][iseg2] = 10*iseg1+iseg2
list_append.append(list_run)
print list_append
print list_assign
执行此代码段时,输出为:
[[0, 1, 2], [10, 11, 12], [20, 21, 22], [30, 31, 32]]
[[30, 31, 32], [30, 31, 32], [30, 31, 32], [30, 31, 32]]
虽然我希望在这两种情况下都能得到第一个结果。
我的初步猜测是,它是*
中list_assign = [ [None]*3 ]*4
运算符的副作用,但即便如此,它也很奇怪,因为它仅适用于嵌套列表中的一个维度。
这是预期的吗?这是一个错误吗?它是否特定于python 2.7?我应该使用numpy数组,还是其他一些标准方法来避免list_append路径,这路径更笨重,可能效率更低?
PS:对于那些对背景颜色感兴趣的人,我正在构建的嵌套列表实际上是一个函数列表,所以我花了很多时间试图理解问题是否在变量的水平上。功能def中的范围;因此失去了几个小时