如何正确克隆二维数组?
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)
...
【讨论】:
以上是关于如何正确克隆二维数组?的主要内容,如果未能解决你的问题,请参考以下文章