Python 在类中声明变量后发生NameError

Python 在类中声明变量后发生NameError,python,Python,我模拟了一副牌,其中从抽牌堆列表中返回一张随机牌,然后从抽牌堆中移除,并将其附加到丢弃牌堆中 class Deck: draw_pile = ["example_1", "example_2", "example_3"] discard_pile = [] def draw(self): card = random.choice(draw_pile) draw_pile.remove(card) discard_pile

我模拟了一副牌,其中从抽牌堆列表中返回一张随机牌,然后从抽牌堆中移除,并将其附加到丢弃牌堆中

class Deck:

    draw_pile = ["example_1", "example_2", "example_3"]
    discard_pile = []

    def draw(self):
        card = random.choice(draw_pile)
        draw_pile.remove(card)
        discard_pile.append(card)
        return card

example_deck = Deck()
print(example_deck.draw())
但我一直得到以下错误:

card = random.choice(draw_pile)
NameError: name 'draw_pile' is not defined"

Python类不会为查找算法创建新的作用域。在draw内部,当无法找到draw_pile的本地定义时,Python接下来会查看下一个封闭范围,即模块级范围,而不是封闭类定义

要访问class属性,您需要使用类名或

def draw(self) :
    card = random.choice(deck.draw_pile)
    deck.draw_pile.remove(card)
    deck.discard_pile.append(card)
    return card
或通过自我间接获取信息;如果未找到名为draw_pile的实例属性,Python接下来将查看self类型的类属性:

可以说,明确draw_-pile和discard_-pile来自何处,并直接使用类名更为简洁。使用self需要您更多地了解self在其MRO中有哪些类

此外,除非deck永远不会有多个实例,否则draw_pile和discard_pile都应该是实例变量,因此必须通过self访问:

使用card=random.choiceself.draw_-pile,draw_-pile是类的一个变量,因此您需要在类中使用self.draw_-pile来访问draw中的值,无论您在哪里有draw_-pile和discard_-pile,您分别指self.draw_-pile和self.discard_-pile;您的变量也需要是self的成员,或者在函数中定义/初始化。请使用_init__方法生成堆,而不是像其他人所说的那样使用self.pile将它们放入类定义访问中。
def draw(self) :
    card = random.choice(self.draw_pile)
    self.draw_pile.remove(card)
    self.discard_pile.append(card)
    return card
class Deck :
    def __init__(self):
        self.draw_pile = ["exmample_1", "example_2", "example_3"]
        self.discard_pile = [""]

    def draw(self) :
        card = random.choice(self.draw_pile)
        self.draw_pile.remove(card)
        self.discard_pile.append(card)
        return card

example_deck = Deck()
print(Deck.draw())