Python代码返回变量内存地址而非值的问题求助
为什么我的代码返回内存地址而不是变量值?
你遇到的问题核心是**__repr__方法定义在了错误的类中**,同时代码里还有其他逻辑问题导致输出不符合预期。下面逐一分析并修正:
你的原始代码
import random class Card: def __init__(self, suit, value): self.suit = suit #['H','D','C','S'] self.value = value #['A',2,3,4,5,6,7,8,9,10,'J','Q','K'] class Deck: def __init__(self): self.cards = [] def __repr__(self): return f'Card("{self.card}")' def build(self): for x in ['H','D','C','S']: for y in range(1,14): self.cards.append(Card(x,y)) if(y==1): self.cards.append(Card(x,'A')) elif(y==11): self.cards.append(Card(x,'J')) elif(y==12): self.cards.append(Card(x,'Q')) elif(y==13): self.cards.append(Card(x,'K')) def shuffle(self): for i in range(len(self.cards)-1,0,-1): r = random.randint(0,i) self.cards[i], self.cards[r] = self.cards[r], self.cards[i] def deal(self): card = self.cards.pop() print(repr(card)) d = Deck() d.build() d.shuffle() d.deal()
原始输出
<__main__.Card object at 0x7f836e0ed070>
问题分析与修正
__repr__方法放错了类
你在Deck类里定义了__repr__,但实际打印的是Card对象。Python默认会用内存地址表示未定义__repr__/__str__的对象,所以必须在Card类中定义这两个方法之一,才能显示卡片的具体信息。Deck类的__repr__存在无效属性Deck类里没有self.card这个属性,只有self.cards列表,这个方法本身是多余的,除非你想自定义Deck对象的显示格式。build方法重复添加卡片
你的循环里,每次先添加Card(x,y),然后又根据y值添加A/J/Q/K,导致每张牌被重复添加了两次(比如y=1时,会同时添加Card(x,1)和Card(x,'A')),这会让牌组变成104张而非标准52张。
修正后的代码
import random class Card: def __init__(self, suit, value): self.suit = suit # ['H','D','C','S'] self.value = value # ['A',2,3,4,5,6,7,8,9,10,'J','Q','K'] # 定义Card对象的repr方法,用于打印时显示具体信息 def __repr__(self): return f"Card(suit='{self.suit}', value={self.value!r})" class Deck: def __init__(self): self.cards = [] def build(self): suits = ['H','D','C','S'] # 直接用预设的value列表,避免重复添加 values = ['A',2,3,4,5,6,7,8,9,10,'J','Q','K'] for suit in suits: for value in values: self.cards.append(Card(suit, value)) def shuffle(self): for i in range(len(self.cards)-1,0,-1): r = random.randint(0,i) self.cards[i], self.cards[r] = self.cards[r], self.cards[i] def deal(self): card = self.cards.pop() print(repr(card)) d = Deck() d.build() d.shuffle() d.deal()
修正后示例输出
Card(suit='S', value='K')
内容的提问来源于stack exchange,提问作者Daniel Chircop
相关产品推荐
相关产品推荐

