鉴于以下程序,我希望变量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
何时发生变化?我怎样才能防止这种情况发生?
答案 0 :(得分:3)
bar
是一个指针列表。您正在使用bar2 = bar[:]
复制这些指针。但是,除非您更改这些指针,否则它们仍然指向相同的列表,因此bar[x][y]
和bar2[x][y]
引用相同的数据。尝试使用
bar2 = copy.deepcopy(bar)
而不是
bar2 = bar[:]
您需要import copy