我才刚刚开始真正地涉足Python,所以这可能有一个非常简单的答案,但此刻我却傻眼了。这是我的代码的要点:
class deck:
cards = [
'ace of spades',
'two of spades',
'three of spades',
] #...and so on
def deal(self, hand): #takes the last card in the deck and transfers it to the supplied hand
hand.add_card(self.cards.pop(-1))
class hand:
cards = []
def add_card(self, card):
self.cards.append(card)
foobar = deck()
hand1 = hand()
hand2 = hand()
foobar.deal(hand1)
print(hand2.cards) #['three of spades']
我想要的是能够通过调用
deck.deal(hand)
将卡片从卡组放到手上。好消息是,上面的代码确实确实从
foobar
中取出了一张卡片并将其添加到hand1
中。坏消息是...它也将其添加到hand2
中。这可能是我经历过编程以来最困惑的事情。
hand1
和hand2
显然是两个不同的变量!那么,为什么一只手也发一张牌,另一只手又发同一张牌呢?我的意思是,甚至仅提及hand2
是在创建时。 最佳答案
您的问题是您在cards = []
类的主体中编写了hand
。这使它成为一个类变量,该变量在该类的所有实例之间共享(在您的情况下,hand1
和hand2
是hand
类的两个不同实例)。如果有任何实例更改,它将自动反映在所有其他实例中。
要在仅属于单个实例的类中创建实例变量,您应该在hand
类内创建一个构造器,该构造器将self.cards
初始化为:
def __init__(self):
self.cards = []
在Python课程的Object-Oriented Programming(“实例变量”小节)和Class and Instance Variables章节中,可以找到有关实例和类变量的易于理解的介绍。有关类和实例变量的官方文档分别在Python文档的9.3.2和9.3.3部分中。