Python类创建带独立列表的玩家实例失败,报NameError求助
问题分析与修复方案
咱们来拆解你遇到的几个核心问题,一步步把代码理顺:
1. 类属性未绑定到实例
你的player类的__init__方法里,hand、up、down只是局部变量,没有用self.前缀绑定到实例上——这意味着这些列表根本不会成为玩家对象的属性,后续自然无法通过N.hand访问它们。
2. 玩家实例未被正确存储
在循环创建玩家时,你只是把循环变量name重新赋值为player实例,但并没有把这些实例保存到全局的N、L变量或者一个集合里。循环结束后,这些实例没有被引用,相当于白创建了,所以后面调用N.hand时会提示变量未定义。
3. 随机抽卡函数的错误
random.randint()需要传入两个整数参数(最小值和最大值),而你传入的range(deck)是错误的。正确的做法要么是生成0到len(deck)-1之间的随机索引,要么更简洁地用random.choice()直接从列表中选元素。
修正后的完整代码
import random deck = ["ha", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "h10", "hj", "hq", "hk", "da", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "dj", "dq", "dk"] cardsperset = 3 playernames = ["N", "L"] class Player: # 遵循PEP8规范,类名用大驼峰命名 def __init__(self, name): self.name = name # 把列表绑定到self,成为实例的专属属性 self.hand = [] self.up = [] self.down = [] # 用字典存储玩家实例,方便通过名称快速查找 players = {} for name in playernames: players[name] = Player(name) def random_card(): # 用random.choice直接从deck选随机元素,比手动生成索引更简洁 rand_card = random.choice(deck) deck.remove(rand_card) return rand_card # 从字典中取出玩家N的实例 player_n = players["N"] for i in range(cardsperset): player_n.hand.append(random_card()) player_n.down.append(random_card()) player_n.up.append(random_card()) print(player_n.hand)
额外优化建议
- 遵循PEP8命名规范:类名用大驼峰(比如
Player而非player),函数名用小写加下划线(比如random_card而非randomcard),能大幅提升代码可读性。 - 用字典存储玩家实例比单独的变量更灵活,尤其是当玩家数量增加时,不需要逐个创建新变量。
- 如果需要给所有玩家统一发牌,可以遍历字典里的所有玩家实例,而不是单独处理某一个。
内容的提问来源于stack exchange,提问作者Nathan Boswell-Holmes
相关产品推荐
相关产品推荐

