You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

问题分析与修正

  1. __repr__方法放错了类
    你在Deck类里定义了__repr__,但实际打印的是Card对象。Python默认会用内存地址表示未定义__repr__/__str__的对象,所以必须在Card类中定义这两个方法之一,才能显示卡片的具体信息。

  2. Deck类的__repr__存在无效属性
    Deck类里没有self.card这个属性,只有self.cards列表,这个方法本身是多余的,除非你想自定义Deck对象的显示格式。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:15:16