对于用户输入的列表和硬编码的列表,For循环给出不同的结果

时间:2019-09-01 07:46:51

标签: python python-3.x

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

像这样,每个密钥对是:

'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()

1 个答案:

答案 0 :(得分:1)

您想要为每个玩家提供一个新的清单...而不是为所有玩家提供相同的清单;将代码更改为

     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]确实不是一个列表...而是一个每次都会创建一个新的单独列表对象的“列表构造函数”。