python - 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()
解决方案
您想要为每个玩家提供一个全新的列表……而不是所有玩家的相同列表;将代码更改为
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]
实际上并不是一个列表……而是一个“列表构造函数”,每次都会评估一个新的单独列表对象。
推荐阅读
- node.js - Elasticsearch 和 Strapi:如何使用 Strapi cms 创建“geo_point”类型字段
- angular - RXJS如何组合算子?
- python - 如何使用 Python 的“MIME 处理包”发送电子邮件?
- python - 处理 Project Euler 问题的 Python 代码时出现内存错误
- r - 如何在 data.table 中链接 group_by、filter、distinct、count?
- c# - 保存前 C# 配置命令 AppSettings
- sqlite - 从单个 .csv 文件插入多个表
- ios - 如何获得与 StoreKit 2 的交易以出示退款单?
- javascript - Discord.js(v13) - 使用不和谐按钮删除频道
- reactjs - 每个类组件只有一个 ComponentDidMount?