python 3.8.6 中意外修改列表的函数

A function unwantedly modifying a list in a python 3.8.6

我正在制作 21 点主机游戏。基本上,我为该程序创建并需要的一个功能是为玩家和庄家输出手牌的功能。如果您曾经玩过二十一点,您就会知道庄家隐藏了一张牌。所以当这个函数输出手牌时,应该用问号替换庄家手牌列表中的第一个值。它就是这样做的。但是它也在函数之外修改了列表,这是一个问题。我已将该函数单独隔离到一个脚本中,以确保它是问题的根本原因,而不是我程序中的其他原因:

def outputDecks(a, b, hiddenBool):
    bModif = b

    if hiddenBool == True:  
        bModif[0] = "?"

    print("Player Cards: " + str(a))
    print("Dealer Cards: " + str(bModif) + "\n")


a = [1, 2, 3, 4]
b = [5, 6, 7, 8]

outputDecks(a, b, True)

print(a)
print(b) 

这是输出:

Player Cards: [1, 2, 3, 4]
Dealer Cards: ['?', 6, 7, 8]

[1, 2, 3, 4]
['?', 6, 7, 8]

希望你能看到这里的问题。我已经将列表输入到函数中。需要用问号显示的列表 b 将其内容复制到一个新变量中,并用问号修改该变量。然而,当我在 运行 函数之后打印列表时,问号不存在。但是我从来没有修改过原始列表,所以为什么会有问号?我希望这不是一个有明显修复的真正愚蠢的问题,我在浪费你们大家的时间,但我已经盯着这个问题看了将近一个小时,但无法弄清楚。我尝试谷歌搜索但找不到解决方案,可能是因为我不知道如何用词来搜索。真心希望大家帮帮我

您需要复制bbModif将被引用

    bModif = b.copy()

List b, the one that needs to be displayed with the question mark, has its contents copied into a new variable, and that variable is modified with the question mark

这就是问题所在。 bModif = b 不会将 b 内容复制到 bModifbModif 是对 b 引用的同一个列表的引用。如果您想要 python 中的列表副本,请使用 bModif = b.copy()