基本上,我有字典,每个键对都有其值作为列表。原因是为了以后可以在列表中插入或附加其他值。
像这样,每个密钥对是:
'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()
答案 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]
确实不是一个列表...而是一个每次都会创建一个新的单独列表对象的“列表构造函数”。