gpt4 book ai didi

python - 对一个对象执行某些操作会对同一类的所有对象执行相同的操作吗?

转载 作者:行者123 更新时间:2023-11-30 23:06:27 25 4
gpt4 key购买 nike

我才刚刚开始认真涉足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 中。

这可能是我编程以来最困惑的一次。 hand1hand2非常明显的两个不同的变量!那么为什么向一只手发一张牌也会向另一只手发同一张牌呢?我的意思是,唯一一次提及 hand2 是在创建它的时候。

最佳答案

您的问题是您在 hand 类的主体中编写了 cards = [] 。这使其成为一个类变量,在该类的所有实例之间共享(在您的情况下,hand1hand2是两个不同的>hand 类的实例)。如果任何实例更改它,它将自动反射(reflect)在所有其他实例中。

要在类中创建仅属于单个实例的实例变量,您应该在hand类中创建一个初始化self的构造函数.cards 像这样:

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

Object-Oriented Programming 中提供了对实例和类变量的简单介绍。 (“实例变量”小节)和 Class and Instance Variables Python 类(class)中的章节。有关类和实例变量的官方文档位于 9.3.2 部分。和 9.3.3分别是 Python 文档的 。

关于python - 对一个对象执行某些操作会对同一类的所有对象执行相同的操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32640196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com