在不使用深层复制的情况下编写深层复制

问题描述 投票:0回答:1

所以我需要制作嵌套列表的深层副本,但不使用导入副本。我有一个单独的函数来输出 Board

Board = [['B', 'B', 'B', 'B', 'B'], ['B', 'B', 'B', 'B', 'B'], ['B', 'B', '', 'W', 'W'], ['W', 'W', 'W', 'W', 'W'], ['W', 'W', 'W', 'W', 'W'], 0]

所以我想到这样做来使用for循环进行深度复制:

def copy(b: Board) -> Board:
    if isinstance(b, list):
        return [copy(item) for item in b]
    else:
        return b

但是当这样做时,我想我只是返回 b 而没有进行深层复制,因为末尾的 0 是一个整数? 我是否也正确地认为,为了测试我是否进行了正确的深度复制,我可以执行以下操作来确认:

copy == Board 
True 
copy is Board
False

返回副本时,我得到以下信息:

[['B', 'B', 'B', 'B', 'B'], ['B', 'B', 'B', 'B', 'B'], ['B', 'B', '', 'W', 'W'], ['W', 'W', 'W', 'W', 'W'], ['W', 'W', 'W', 'W', 'W'], 0]
但是当尝试使用“==”和“is”进行测试时,我得到:

copy == make_Board
False
copy is make_Board
False

编辑 读了一下之后,我似乎使用了“is”和“==”错误。我应该是:

copy(Board) is Board 
False

从而确认它不是深拷贝

python loops nested-lists
1个回答
0
投票

要制作董事会的副本,您可以使用下一个示例:

Board = [
    ["B", "B", "B", "B", "B"],
    ["B", "B", "B", "B", "B"],
    ["B", "B", "", "W", "W"],
    ["W", "W", "W", "W", "W"],
    ["W", "W", "W", "W", "W"],
    0,
]


def copy_board(b):
    return [item[:] if isinstance(item, list) else item for item in b]


new_Board = copy_board(Board)
new_Board[0][0] = "XXX"

print(Board)
print(new_Board)

打印:

[
    ["B", "B", "B", "B", "B"],
    ["B", "B", "B", "B", "B"],
    ["B", "B", "", "W", "W"],
    ["W", "W", "W", "W", "W"],
    ["W", "W", "W", "W", "W"],
    0,
]

[
    ["XXX", "B", "B", "B", "B"],
    ["B", "B", "B", "B", "B"],
    ["B", "B", "", "W", "W"],
    ["W", "W", "W", "W", "W"],
    ["W", "W", "W", "W", "W"],
    0,
]
© www.soinside.com 2019 - 2024. All rights reserved.