【问题标题】:How to clone a 2D Array properly?如何正确克隆二维数组?
【发布时间】:2020-05-11 14:32:35
【问题描述】:

我是 python 新手,我的第一个项目是手动编写一个 tictactoe 游戏。

所以当我试图写一个“toString”方法时,我遇到了一个二维数组的问题,如下

board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
binit = board[:]
for x in range(3):
    for y in range(3):
        if int(binit[x][y]) == 0:
            binit[x][y] = "_"
        elif int(binit[x][y]) == 1:
            binit[x][y] = "X"
        else:
            binit[x][y] = "O"

print(binit)
print(board)

我玩的时候得到的输出是:

ID: board 140662640260544
ID: binit 140662640580864
board: [['X', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
binit: [['X', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

虽然董事会本身应该没有改变。

bint = board.copy() 也不起作用。

【问题讨论】:

标签: python arrays multidimensional-array tic-tac-toe


【解决方案1】:

您可以使用copy.deepcopy来克隆板子。

【讨论】:

    【解决方案2】:

    当一个列表被分配给另一个列表变量时,Python 使用按引用传递,因此当对 binit 进行更改时,更改发生在板地址,即板和 bint 都是内存中的相同对象。下面是一个小例子来理解这一点:

    listA = [0]
    listB = listA
    listB.append(1)
    print("List B: " + str(listB))
    print("List A: " + str(listA))
    print("Address of listB: " + hex(id(listB)))
    print("Address of listA: " + hex(id(listA)))
    

    上面的代码会生成以下打印,请注意地址可以随着运行而改变,但对于 listA 和 listB 应该是相同的:

    List B: [0, 1]
    List A: [0, 1]
    Address of listB: 0x1d146de5148
    Address of listA: 0x1d146de5148
    

    要为listB 构造一个新对象,请使用深拷贝。深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。例如下面:

    import copy
    
    listA = [0]
    listB = copy.deepcopy(listA)
    listB.append(1)
    print("List B: " + str(listB))
    print("List A: " + str(listA))
    print("Address of listB: " + hex(id(listB)))
    print("Address of listA: " + hex(id(listA)))
    

    上面的例子使用深拷贝打印,这表明listB的深拷贝地址发生了变化,而变化只发生在listB上:

    List B: [0, 1]
    List A: [0]
    Address of listB: 0x23a95f8e288
    Address of listA: 0x23a95f8e248
    

    【讨论】:

      【解决方案3】:

      使用copy.deepcopy()

      from copy import deepcopy
      
      board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
      binit = deepcopy(board)
      ...
      

      【讨论】:

        猜你喜欢
        • 2013-11-23
        • 2013-10-31
        • 2015-01-28
        • 2018-02-11
        • 2019-05-09
        • 2013-04-17
        • 2017-01-27
        • 1970-01-01
        相关资源
        最近更新 更多