簡體   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