我正在尝试在python中构建一副牌,但我试图将所有信息存储在字典中。我需要存储卡的名称(例如,2,4,&#39; K&#39;用于国王,&#39; J&#39;用于插孔等),卡的价值在黑色插孔(即, 2值2,“A&#39;对于ace值1或11(取决于场景)”,并且特定卡的数量保留在牌组中。但是当我编写我的python代码时,我意识到所有的卡值都等于8.现在,我知道有些东西不对,但我是python的新手,我想知道为什么我会产生如此毁灭性的结果< / p>
代码示例:
class Card(object):
def __init__(self, list):
self.deck_list = list
self.construct_deck()
def construct_deck(self):
#Here we created a dictionary from the list keys
self.deck = dict.fromkeys(self.deck_list, {'total': 4, 'value': 0})
self.keys = self.deck.keys()
for key in self.keys:
try:
value = int(key)
except:
if key != 'A':
value = 10
else:
value = [1,11]
finally:
self.deck[key]['value'] = value
def shuffle_deck(self):
pass
l = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
bj = Card(l)
print bj.deck
代码应该执行以下操作:
答案 0 :(得分:0)
您的初始“fromkeys”语句将所有值设置为相同的dict对象。您可以通过以下方式证明:
print bj.deck['3'] is bj.deck['4']
# prints True
由于这些值都是对同一个dict的引用,因此您解析的最后一个键“8”将成为该词典的“值”。
您可以通过为每个密钥创建单独的dict来解决此问题:
self.deck = dict([(k, {'total': 4, 'value': 0})
for k in self.deck_list])
答案 1 :(得分:0)
问题是您使用值为dict的dict.fromkeys()
作为默认值。这会将相同的字典设置为所有键的值,因此如果您更新一个,它们都会更新。
更好的解决方案是设置一个空的dict,然后迭代通过deck_list。 (另请注意,self.keys
与self.deck_list
相同;两者都没有。“
此外,你应该总是避免空白;捕获您期望的错误,在这种情况下只是ValueError。这也不是finally
的好用;只需删除它并取消阻止该块。
self.deck = {}
for key in self.deck_list:
try:
value = int(key)
except ValueError:
if key == 'A':
value = [1,11]
else:
value = 10
self.deck[key] = {'total': 4, 'value': value}