Python字典作为函数参数使用时

zd287kbt  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(147)

我可能没有正确使用字典,但无论如何,这是我试图做的:
1.设置一个起始字典。这将被用作空模板。
1.将字典传递给一个函数。在函数中,它将被分配一个新的变量名,这样我就可以对它做一些事情。
1.通过向字典中添加条目来处理字典。
1.将字典返回到主代码中的其他变量。
1.对主代码中的另一个变量重复上述操作。每一次都要接受模板字典并对它做一些事情。
但似乎发生的是,“起始”字典也更新了,所以当我第二次通过它时,它充满了我不想要的信息。
下面是一个最小的例子:

startDeck = {
  "deckSize":0,
  "score":0,
  "blackjack":False,
}

def playBlackjack(deck):
  userDeck = dealCards(cards= deck,count=2)
  compDeck = dealCards(cards= deck,count=1)

def dealCards(cards,count):
  
  score = cards["score"]
  deckSize = cards["deckSize"]
  
  for n in range(count):
    newCard = {}
    deckSize+=1
    score+=1
    cardNo = "card" + str(deckSize)

    newCard["card"] = "hearts"
    newCard["value"] = 10
    newCard["suit"] = "clubs"
    cards[cardNo]=newCard

  cards["score"]=score
  cards["deckSize"]=deckSize

  return cards

playBlackjack(startDeck)

我觉得应该可以。我知道这可能没有多大意义,也许我不应该使用字典,但我确实与他们斗争,并希望有一个去与他们了解更多。
但本质上这里发生的是所有的字典,无论是顶部的“startDeck”(我认为它是全局的,因此对任何函数都可用,但我一直被python告知它看不到它?))或我认为只在函数运行时存在的字典,最终都填充了完全相同的信息。我不明白为什么。

x6492ojm

x6492ojm1#

这是因为字典是作为引用传递的。你可以通过谷歌搜索“引用与值类型”来了解更多,有很多关于这个主题的资源。
这是一个基本的编程概念,为了知道你正在操作什么对象,理解它是很重要的(特别是Python,因为它会做一些其他语言可能会抱怨的事情)。它是一个强有力的工具,如果使用明智。
快速总结一下你的问题,Python不会在你的函数playBlackJack中创建一个新对象,因为字典是引用类型的一部分。
要获得词典的副本,您可以:

from copy import deepcopy

def playBlackjack(initial_deck):
  deck = deecopy(initial_deck)
  userDeck = dealCards(cards=deck,count=2)
  compDeck = dealCards(cards=deck,count=1)

相关问题