如何正确克隆二维数组?

Posted

技术标签:

【中文标题】如何正确克隆二维数组?【英文标题】: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() 也不起作用。

【问题讨论】:

变量和函数名称应遵循lower_case_with_underscores 样式。 二维数组 .... 二维数组 这些是 Python 列表,不是数组,小心。 这能回答你的问题吗? How to clone or copy a list? ***.com/q/6532881/11301900 还有很多很多。 【参考方案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)
...

【讨论】:

以上是关于如何正确克隆二维数组?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 如何定义一个二维数组

c语言二维数组如何初始化

如何使用 iOS Accelerate 框架正确填充 FFT 的二维数组

DELPHI 中如何定义这个静态二维数组常量

如何将二维数组写入文本文件?

如何在 H2 中为该表获取正确的二维数组?