繁体   English   中英

Python列表重复整个列表的最后一个元素

[英]Python List Repeating Last Element For Whole List

我在编写python程序只是为了制作一个简单的扑克游戏。 我只想熟悉Python语言。 我知道我编写python代码的方法不完全是Pythonic,但实际上我只是想弄清楚为什么我的列表将最后一个对象重复地追加到列表中的每个空格。 正如我要追加的那样,列表具有正确的值,但是之后它只是重复追加最后一个对象。 我花了大约两天的时间来弄清楚它,我敢肯定这只是我对语言的忽视。 任何帮助,将不胜感激。 这是代码:

class Card(object):
    suit = ""
    value = ""

    def __init__(self, suit, value):
        Card.suit=suit
        Card.value=value

def createDeck():

    suit = ["DIAMONDS", "HEARTS", "CLUBS","SPADES"]
    value = ["ACE", "TWO", "THREE", "FOUR", "FIVE", 
         "SIX", "SEVEN", "EIGHT", "NINE", "TEN", 
         "JACK", "QUEEN", "KING"]
    Deck = []

    for i in range(4):
        for j in range(13):
            card = Card(suit[i],value[j])
            Deck.append(card)
            print(Deck[i].value, "OF", Deck[i].suit)

    displayDeck(Deck)

def displayDeck(Deck = [], *args):
    for i in range(len(Deck)):
        print(Deck[i].value, " OF ", Deck[i].suit)

这是我得到的输出,为简洁起见,以下简称:C:\\ Users \\ root \\ Desktop> py Poker.py

ACE OF DIAMONDS

-All Cards Through-

KING OF SPADES

KING OF SPADES

KING OF SPADES

KING OF SPADES

KING OF SPADES
etc. Until The list is filled (52 spots)

Card.__init__方法中,您设置类属性,而不是实例属性。 因此,每个Card实例都具有相同的属性,即最后一组(黑桃王)。 因此,使用self.设置实例属性self.

class Card(object):
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

因此,类属性的一种用法是西服和值名称的常量:

class Card(object):
    SUITS = ["DIAMONDS", "HEARTS", "CLUBS","SPADES"]
    VALUES = ["ACE", "TWO", "THREE", "FOUR", "FIVE", 
        "SIX", "SEVEN", "EIGHT", "NINE", "TEN", 
        "JACK", "QUEEN", "KING"]

    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

def create_deck():
    deck = []
    for suit in Card.SUITS:
        for value in Card.VALUES:
            card = Card(suit,value)
            deck.append(card)
            print(card.value, "OF", card.suit)
    return deck

def display_deck(deck):
    for card in deck:
        print(card.value, " OF ", card.suit)

deck = create_deck()
display_deck(deck)

像这样尝试

    def __init__(self, suit, value):
       self.suit=suit
       self.value=value

这是您如何为Card对象正确设置西服和值。

for i in range(4):
    for j in range(13):
        card = Card(suit[i],value[j])
        Deck.append(card)
displayDeck(Deck)  

我删除了循环中的打印语句。 现在的输出是:

('ACE', ' OF ', 'DIAMONDS')
('TWO', ' OF ', 'DIAMONDS')
('THREE', ' OF ', 'DIAMONDS')
('FOUR', ' OF ', 'DIAMONDS')
('FIVE', ' OF ', 'DIAMONDS')
('SIX', ' OF ', 'DIAMONDS')
('SEVEN', ' OF ', 'DIAMONDS')
('EIGHT', ' OF ', 'DIAMONDS')
('NINE', ' OF ', 'DIAMONDS')
('TEN', ' OF ', 'DIAMONDS')
('JACK', ' OF ', 'DIAMONDS')
('QUEEN', ' OF ', 'DIAMONDS')
('KING', ' OF ', 'DIAMONDS')
('ACE', ' OF ', 'HEARTS')
('TWO', ' OF ', 'HEARTS')
('THREE', ' OF ', 'HEARTS')
('FOUR', ' OF ', 'HEARTS')
('FIVE', ' OF ', 'HEARTS')
('SIX', ' OF ', 'HEARTS')
('SEVEN', ' OF ', 'HEARTS')
('EIGHT', ' OF ', 'HEARTS')
('NINE', ' OF ', 'HEARTS')
('TEN', ' OF ', 'HEARTS')
('JACK', ' OF ', 'HEARTS')
('QUEEN', ' OF ', 'HEARTS')
('KING', ' OF ', 'HEARTS')
('ACE', ' OF ', 'CLUBS')
('TWO', ' OF ', 'CLUBS')
('THREE', ' OF ', 'CLUBS')
('FOUR', ' OF ', 'CLUBS')
('FIVE', ' OF ', 'CLUBS')
('SIX', ' OF ', 'CLUBS')
('SEVEN', ' OF ', 'CLUBS')
('EIGHT', ' OF ', 'CLUBS')
('NINE', ' OF ', 'CLUBS')
('TEN', ' OF ', 'CLUBS')
('JACK', ' OF ', 'CLUBS')
('QUEEN', ' OF ', 'CLUBS')
('KING', ' OF ', 'CLUBS')
('ACE', ' OF ', 'SPADES')
('TWO', ' OF ', 'SPADES')
('THREE', ' OF ', 'SPADES')
('FOUR', ' OF ', 'SPADES')
('FIVE', ' OF ', 'SPADES')
('SIX', ' OF ', 'SPADES')
('SEVEN', ' OF ', 'SPADES')
('EIGHT', ' OF ', 'SPADES')
('NINE', ' OF ', 'SPADES')
('TEN', ' OF ', 'SPADES')
('JACK', ' OF ', 'SPADES')
('QUEEN', ' OF ', 'SPADES')
('KING', ' OF ', 'SPADES')
[Finished in 0.3s]

为了详细说明Rockybilly的答案,您的Card类定义了两个属性, suitvalue Card类的每个实例都共享这两个值,这意味着如果在一个实例中对其进行更改,则在所有实例中都将对其进行更改。 当您执行Card.suit = suit这样的事情时,这就是Card.__init__方法中当前正在发生的事情。 您正在修改自己创建的所有 Card的西装。 在您的情况下,黑桃王是您创建的最后一张牌,因此它的花色和价值是为您创建的所有52张牌设置的。

您想要做的是将suitvalue视为实例值,这意味着您可以通过self在类中引用它们。 此外,您无需在课程级别(即, class Card行的正下方)设置它们的值。 相反,您只需在__init__方法中对其进行初始化。 尝试将Card类更改为此:

class Card( object ):
    def __init__( self, suit, value ):
        self.suit = suit
        self.value = value

首先,您可以像这样修复Card类:

class Card(object):
    def __init__(self, suit = None, value = None):
        self.suit=suit
        self.value=value

这将解决最后一张卡片显示多次的问题,因为您不再需要不断修改同一张Card对象。 但是在该修复程序之后,由于您的打印说明,您将遇到另一个问题。 这是因为在j每个循环中,您都在套牌中使用了第i张卡,但是直到j增加13i才被取消。 这样会更好:

current = 0
for i in range(4):
    for j in range(13):
        card = Card(suit[i],value[j])
        Deck.append(card)
        print(Deck[current].value, "OF", Deck[current].suit)
        current = += 1

但是显然是凌乱的。 你要:

for i in range(4):
    for j in range(13):
        card = Card(suit[i],value[j])
        Deck.append(card)
display_deck(Deck)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM