Python - 类实例列表属性在追加时更改其他实例列表属性

时间:2014-04-26 18:49:58

标签: python python-3.x

我是Python的新手,所以这可能是一个非常沉闷的问题,虽然我已经搜索了很多关于这个主题并找不到答案。

所以我正在尝试编写一个简单的#34;卡片游戏",并为此定义了一个类"播放器",包含列表属性"卡"。我确保此属性位于" def init "因此它特定于类实例,但是当我将一个元素附加到播放器A的此列表时,它也会将其附加到播放器B. 注意:我的代码还包括一个类" Deck"和"卡"我没有在这里明确表示保持清醒)

class Player(object): #defines Player class, including its score and name
    all_players=[]
    def __init__(self,score,name,cards=[]):
        self.score=score
        self.name=name
        self.cards=cards
        Player.all_players.append(name)

playera=Player(0,'John')
playerb=Player(0,'Bill')
playera.cards.append(Deck.hidden_cards[0])

==> playera.show_cards()和playerb.show_cards()然后打印相同的结果

如果有人可以帮助我,我将不胜感激! 提前谢谢。

1 个答案:

答案 0 :(得分:1)

错误是由于这一行:def __init__(self,score,name,cards=[]): - 因为cards=[]。 对于方法中的可变类型(如空列表),它是在不同实例之间共享的相同列表。使用None初始化并在__init__内为其分配一个空列表。

class Player(object):
    all_players = []
    def __init__(self, score, name, cards=None):
        if cards is None:
            self.cards = []
        ...etc.

修改:有关default parameters

的处理的更好解释,请参阅@BradBudlong's comment below