尽管有 .copy(),为什么我的不同实例变量链接在一起?

Why are my different instance variables linking together despite the .copy()?

作为python的新手,我觉得每一个微不足道的问题都随便问问陌生人问题是什么,但经过研究后,我找不到问题所在。 我创建的是一个使用列表中的列表的 2D 网格移动系统。最终目标是让用户不断地穿过走廊,但在第一个走廊之后,礼物会不断出现在设定的位置。然而,当用户第一次走过礼物时,礼物从硬编码艺术 (lobby_art) 中删除,该艺术仅连接到被编辑的列表 (currentlocation)。 下面尝试从代码中挖掘出问题并进行简化。

lobby_art = [
    ['‖ ', '  ', '  ‖'],
    ['‖ ', '', '  ‖'],
    ['‖ ', '  ', '  ‖'],
    ['‖ ', '', '  ‖'],
]

currentlocation = [
    ['‖ ', '  ', '  ‖'],
    ['‖ ', '  ', '  ‖'],
    ['‖ ', '  ', '  ‖'],
    ['‖ ', '', '  ‖'],
]

def moveup(direction):
    if direction == 'w':
        global currentlocation
        global userlocationY
        if userlocationY == 0:
            global leave_corridor 
            leave_corridor = False
            currentlocation[userlocationY][1] = '  ' #deletes previous location
            return
        currentlocation[userlocationY][1] = '  ' 

        userlocationY -= 1
        currentlocation[userlocationY][1] = ''

def lobbyprint(): #Prints Lobby layout
    global currentlocation
    for i in currentlocation: 
        print(''.join(i))

Corridor_with_present = False
GameOngoing = True  
while GameOngoing:        
    
    
    if Corridor_with_present == True:
        currentlocation = lobby_art.copy()
    
    leave_corridor = True
    userlocationY = 3
    while leave_corridor:
        lobbyprint()
        direction = input("Input w: ")
        moveup(direction)

    Corridor_with_present = True

输出

‖     ‖
‖     ‖
‖     ‖
‖   ‖
Input w: w
‖     ‖
‖     ‖
‖   ‖
‖     ‖
Input w: w
‖     ‖
‖   ‖
‖     ‖
‖     ‖
Input w: w
‖   ‖
‖     ‖
‖     ‖
‖     ‖
Input w: w
‖     ‖
‖   ‖
‖     ‖
‖   ‖
Input w: w
‖     ‖
‖   ‖
‖   ‖
‖     ‖
Input w: w
‖     ‖
‖   ‖
‖     ‖
‖     ‖
Input w: w
‖   ‖
‖     ‖
‖     ‖
‖     ‖
Input w: w
‖     ‖
‖     ‖
‖     ‖
‖     ‖
Input w: w
‖     ‖
‖     ‖
‖   ‖
‖     ‖
Input w:

我尝试过使用 .copy()、[:],甚至在语句中导入副本,但无济于事。

if Corridor_with_present == True:
        currentlocation = lobby_art.copy()

有人知道为什么吗?

谢谢罗伯特。

试试这个:

import copy
if Corridor_with_present == True:
        currentlocation = copy.deepcopy(lobby_art)

lobby_art.copy()只是复制引用,而copy.deepcopy(lobby_art)复制内存中的整个对象。

如下图所示: