Python 对一个对象执行某些操作对同一类的所有对象执行相同的操作?

Python 对一个对象执行某些操作对同一类的所有对象执行相同的操作?,python,class,oop,variables,object,Python,Class,Oop,Variables,Object,我才刚刚开始认真地涉猎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 trans

我才刚刚开始认真地涉猎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的时间是在创建它的时候。

您需要创建一个实例变量,而不是类变量:

class hand:
    def __init__(self):
        self.cards = []

你的问题是你在你的
hand
类的主体中写了
cards=[]
。这使得它成为一个类变量,在类的所有实例之间共享(在您的例子中,
hand1
hand2
hand
类的两个不同的实例)。如果任何实例更改了它,它将自动反映在所有其他实例中

要在只属于单个实例的类中创建一个实例变量,您应该在
hand
类中创建一个构造函数,该构造函数初始化
self.cards
,如下所示:

def __init__(self):
    self.cards = []

Python课程的(“实例变量”小节和章节中提供了实例和类变量的易读介绍。关于类和实例变量的官方文档分别在Python文档的章节和章节中。

可能的副本实际上更多的是副本。它可能会帮助您查看链接问题Cal的答案。首先,您需要了解类和对象之间的区别。您正在使用类,就好像它们是对象一样。您需要实例化类并为牌组和手创建对象。Pythonwise,
卡片
,在两个类中都是类属性,而不是实例属性这是因为主体中的代码是在类定义时执行的,而不是在对象实例化时执行的,因此对象只创建一次(然后在所有实例之间共享)