首页 > 解决方案 > For 循环为用户输入的列表与硬编码列表提供不同的结果

问题描述

基本上我有字典,每个键对都有它的值作为列表。原因是我以后可以在列表中插入或附加其他值。

像这样,每个密钥对是:

'A' : [2]

为了使测试代码更快,我硬编码了 playerDict 的一部分,如下所示:

playerDict = {"A" : [2], "B" : [2], "C" : [2]}

我还允许输入额外的密钥对。所以我可以手动输入额外的密钥对“D”和“E”

{'A': [2], 'B': [2], 'C': [2], 'D': [2], 'E': [2]}

当我打印出 playerDict 时看起来完全一样。但是,当我通过 for 循环运行它以将值插入/追加到列表中时,行为是不同的。

{'A': [2, 5, 1, 4], 'B': [2, 6, 5, 1], 'C': [2, 6, 5, 1], 'D': [2, 8, 6, 1, 5, 5, 3], 'E': [2, 8, 6, 1, 5, 5, 3]}

A、B 和 C 的行为是我想要的,这只是在列表的索引 1 处插入 1 次,在每个密钥对的列表末尾追加 2 次。

但是,对于手动输入的密钥对,它会被插入并附加多少次我手动放置一个密钥对。放入 2 个密钥对,2 次,放入 3 个密钥对,它被插入并附加 3次。

{'A': [2, 6, 2, 4], 'B': [2, 3, 1, 2], 'C': [2, 6, 4, 2], 'D': [2, 9, 10, 11, 5, 6, 4, 6,6, 3], 'E': [2, 9, 10, 11, 5, 6, 4, 6, 6, 3], 'F': [2, 9, 10, 11, 5, 6, 4, 6, 6, 3]}

它让我发疯,因为我不确定我的硬编码密钥对和手动输入的密钥对之间有什么区别。我怎样才能得到我想要的行为?

import random

def rollDice():
  return random.randint(1, 6)

def getPlayers(playerDict):

  points = [2]
  while True:
    name = str(input("Enter player name, <Enter> to end: "))

    if name == "":
      break
    else:
      playerDict[name] = points
      print(playerDict, "adding a user")
  return playerDict

def startGame(playerDict):
  print("Start game. Roll 2 dice per player")

  for names, stats in playerDict.items():
    rollstart1 = rollDice()
    rollstart2 = rollDice()
    total = rollstart1 + rollstart2

    stats.insert(1, total)
    stats.append(rollstart1)
    stats.append(rollstart2)
    print("{}, dice: ({}, {}), total {}".format(names, stats[2], stats[3], stats[1]))
  return playerDict

def main():

  #playerDict = {}
  playerDict = {"A" : [2], "B" : [2], "C" : [2]}

  playerDict = getPlayers(playerDict)
  playerDict = startGame(playerDict)
  print(playerDict)

main()

标签: pythonpython-3.x

解决方案


您想要为每个玩家提供一个全新的列表……而不是所有玩家的相同列表;将代码更改为

     playerDict[name] = [2]

应该做的伎俩。

重要的是要了解 Python 赋值不会复制对象。如果您想制作副本,则需要明确询问:

a = [2]
b = a
a.append(12)
print(b) # will print [2, 12] because a and b reference the same list object

在 Python 中,“列表文字”[2]实际上并不是一个列表……而是一个“列表构造函数”,每次都会评估一个新的单独列表对象。


推荐阅读