在python中的OOP中,用默认值初始化对象时,对象的不同实例是否相同



我正在努力理解面向对象编程。我通过创建一个类似扑克的小程序来做到这一点。我遇到了一个问题,它的最小工作示例是:

对于此代码:

import random
class superthing(object):
def __init__(self,name,listthing=[]):
self.name = name
self.listthing = listthing
def randomlyadd(self):
self.listthing.append(random.randint(1,50))
def __str__(self):
return 'nName: '+str(self.name)+'nList: '+str(self.listthing)
Aboy = superthing('Aboy')
Aboy.randomlyadd()
print(Aboy)
Anotherboy = superthing('Anotherboy')
Anotherboy.randomlyadd()
print(Anotherboy)

我期望这个输出:

Name: Aboy
List: [44] 

(一些数字介于1和50之间(

Name: Anotherboy
List: [11] 

(同样是介于1和50之间的随机数(但我得到的是:

Name: Aboy
List: [44] 

(符合我的期望(

Name: Anotherboy
List: [44,11] 

(它将此数字附加到上一个实例中的列表中(为什么会发生这种情况?背景是两名玩家从一副牌中得到一张牌。如果存在类似的问题,我很抱歉,如果存在,如果你能指出,我会仔细阅读。新到堆栈溢出。提前谢谢。

对于非最小的例子,我正在尝试:

import random
class Card(object):
def __init__(self, suit, value):
self.suit = suit
self.value = value
def getsuit(self):
return self.suit
def getval(self):
return self.value
def __str__(self):
if(self.suit == 'Clubs'):
suitstr = u'u2663'
elif(self.suit == 'Diamonds'):
suitstr = u'u2666'
elif(self.suit == 'Hearts'):
suitstr = u'u2665'
elif(self.suit == 'Spades'):
suitstr = u'u2660'
if((self.value<11)&(self.value>1)):
valuestr = str(self.value)
elif(self.value == 11):
valuestr = 'J'
elif(self.value == 12):
valuestr = 'Q'
elif(self.value == 13):
valuestr = 'K'
elif((self.value == 1)|(self.value == 14)):
valuestr = 'A'
return(valuestr+suitstr)
class Deck(object):
def __init__(self,DeckCards=[]):
self.DeckCards = DeckCards
def builddeck(self):
suits = ['Hearts','Diamonds','Clubs','Spades']
for suit in suits:
for i in range(13):
self.DeckCards.append(Card(suit,i+1))
def shuffle(self):
for i in range(len(self)):
r = random.randint(0,len(self)-1)
self.DeckCards[i],self.DeckCards[r] = self.DeckCards[r],self.DeckCards[i]
def draw(self):
return self.DeckCards.pop()
def __str__(self):
return str([card.__str__() for card in self.DeckCards])
def __len__(self):
return len(self.DeckCards)
class Player(object):
def __init__(self,Name,PlayerHandcards = [],Balance = 1000):
self.Name = Name
self.Hand = PlayerHandcards
self.Balance = Balance
def deal(self,deck):
self.Hand.append(deck.draw())
def __str__(self):
return 'Name :'+str(self.Name)+'n'+'Hand: '+str([card.__str__() for card in self.Hand])+'n'+'Balance: '+str(self.Balance)

deck1 = Deck()
deck1.builddeck()
deck1.shuffle()
Alice = Player('Alice')
Alice.deal(deck1)
print(Alice)
Bob = Player('Bob')
Bob.deal(deck1)
print(Bob)

在和鲍勃打交道后,他们都有了相同的手。如果您对代码有其他建议,也欢迎与我们分享。

这是"最小惊奇"和@Mad Physiciast指示的可变默认参数的重复。同样结束这个问题。