分配vs附加在嵌套的Python列表中

时间:2014-03-21 11:31:01

标签: python python-2.7 variable-assignment nested-lists

我花了半天时间寻找一个可以归结为以下嵌套列表分配行为的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中的范围;因此失去了几个小时

0 个答案:

没有答案