Python:变量复制中无法解释的案例

时间:2014-04-02 22:54:24

标签: python function variables copying shadowing

鉴于以下程序,我希望变量bar保持不变。

def foo(bar):
    bar2 = bar[:]
    chg = []
    for p in range(4):
        for q in range(3):
            chg.append([p,q])
    for [x,y] in chg:
        bar2[x][y] = "xx"
    return bar2

def printGrid(grid):
    for row in grid:
        print " ".join(row)    
    print

bar = [[str(i) + str(j) for i in range(5)] for j in range(6)]
printGrid(bar)
printGrid(foo(bar))
printGrid(bar)

然而,这是输出:

00 10 20 30 40
01 11 21 31 41
02 12 22 32 42
03 13 23 33 43
04 14 24 34 44
05 15 25 35 45

xx xx xx 30 40
xx xx xx 31 41
xx xx xx 32 42
xx xx xx 33 43
04 14 24 34 44
05 15 25 35 45

xx xx xx 30 40
xx xx xx 31 41
xx xx xx 32 42
xx xx xx 33 43
04 14 24 34 44
05 15 25 35 45

我不明白。前2个网格符合预期,但bar何时发生变化?我怎样才能防止这种情况发生?

1 个答案:

答案 0 :(得分:3)

bar是一个指针列表。您正在使用bar2 = bar[:]复制这些指针。但是,除非您更改这些指针,否则它们仍然指向相同的列表,因此bar[x][y]bar2[x][y]引用相同的数据。尝试使用

bar2 = copy.deepcopy(bar)

而不是

bar2 = bar[:]

您需要import copy