[英]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
類定義了兩個類屬性, suit
和value
。 Card
類的每個實例都共享這兩個值,這意味着如果在一個實例中對其進行更改,則在所有實例中都將對其進行更改。 當您執行Card.suit = suit
這樣的事情時,這就是Card.__init__
方法中當前正在發生的事情。 您正在修改自己創建的所有 Card
的西裝。 在您的情況下,黑桃王是您創建的最后一張牌,因此它的花色和價值是為您創建的所有52張牌設置的。
您想要做的是將suit
和value
視為實例值,這意味着您可以通過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
增加13
, i
才被取消。 這樣會更好:
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.