【问题标题】:Python: unexplainable case in variable copyingPython:变量复制中无法解释的情况
【发布时间】:2014-04-02 22:54:23
【问题描述】:

鉴于以下程序,我希望变量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 何时发生变化?我怎样才能防止这种情况发生?

【问题讨论】:

  • 你的网格是二维的。它是数组数组。当您[:] 时,您只复制第一级,因此 bar2[x] 与 bar[x] 是同一个对象
  • 尝试改用bar2 = copy.deepcopy(bar)

标签: python function variables copying shadowing


【解决方案1】:

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

bar2 = copy.deepcopy(bar)

而不是

bar2 = bar[:]

您需要import copy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多