Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 黑桃王牌的奇特案例(在python3中创建对象数组)_Arrays_Python 3.x_Self - Fatal编程技术网

Arrays 黑桃王牌的奇特案例(在python3中创建对象数组)

Arrays 黑桃王牌的奇特案例(在python3中创建对象数组),arrays,python-3.x,self,Arrays,Python 3.x,Self,我正在尝试创建一组对象(卡片)。为此,我在Deck.construct()方法中的Deck.Card对象上使用Card.construct()方法。我能够成功地创建一个由纸牌对象组成的数组(Deck.cards),问题是所有这些都是黑桃王牌,其中有52张。这是创建阵列的位置: def construct(self): for value in self.card.values: for suit in self.card.suits:

我正在尝试创建一组对象(卡片)。为此,我在Deck.construct()方法中的Deck.Card对象上使用Card.construct()方法。我能够成功地创建一个由纸牌对象组成的数组(Deck.cards),问题是所有这些都是黑桃王牌,其中有52张。这是创建阵列的位置:

def construct(self):
        for value in self.card.values:
            for suit in self.card.suits:
                self.card.construct(value, suit)
                self.card.showNice()
                self.cards.append(self.card)
不同种类的卡片在分配之前被正确打印,但由于某些原因,只有黑桃王牌似乎被添加到数组中。我真的不明白为什么会这样

import random

class Card:
    def __init__(self):
        self.value = ''
        self.values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
        self.suit = ''
        self.suits = ['♥', '♦', '♣', '♠']
        self.valit = (self.value, self.suit)

    def construct(self, value, suit):
        self.value = value
        self.suit = suit
        self.valit = (value, suit)

    def random(self):
        self.valit = (random.choice(self.values), random.choice(self.suits))

    def show(self):
        print(self.valit, end='')

    def showNice(self):
        print(self.value, self.suit, ' ', sep='', end='')

class Deck:
    def __init__(self):
        self.card = Card()
        self.cards = []

    def construct(self):
        for value in self.card.values:
            for suit in self.card.suits:
                self.card.construct(value, suit)
                self.cards.append(self.card)

    def shuffleUp(self):
        random.shuffle(self.cards)

    def show(self):
        for card in self.cards:
            card.show()
        print('\n')

    def showNice(self):
        for card in self.cards:
            card.showNice()
        print('\n')


我对对象、类、方法等的整个概念都是陌生的。因此,我很可能没有以正确的方式优化代码,任何建议都值得赞赏。提前谢谢

问题是,您正在一次又一次地重复使用
卡的同一实例,并在将其添加到列表中后对其进行更改。您已将对同一张卡的引用添加到列表中52次,并将同一张卡更改了52次。这就是为什么它最终会出现在最后一个组合中

注意这一部分:

def construct(self):
    for value in self.card.values:
        for suit in self.card.suits:
            self.card.construct(value, suit)
            self.cards.append(self.card)

    print(self.cards) # I added this line
这是
打印的内容
打印的内容:

[<__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>]
这是新版本打印的内容:

[<__main__.Card object at 0x0376DB90>, <__main__.Card object at 0x0376DBB0>, <__main__.Card object at 0x0376DBD0>, <__main__.Card object at 0x0376DBF0>, <__main__.Card object at 0x0376DC10>, <__main__.Card object at 0x0376DC30>, <__main__.Card object at 0x0376DC50>, <__main__.Card object at 0x0376DC70>, <__main__.Card object at 0x0376DC90>, <__main__.Card object at 0x0376DCB0>, <__main__.Card object at 0x0376DCD0>, <__main__.Card object at 0x0376DCF0>, <__main__.Card object at 0x0376DD10>, <__main__.Card object at 0x0376DD30>, <__main__.Card object at 0x0376DD50>, <__main__.Card object at 0x0376DD70>, <__main__.Card object at 0x0376DD90>, <__main__.Card object at 0x0376DDB0>, <__main__.Card object at 0x0376DDD0>, <__main__.Card object at 0x0376DDF0>, <__main__.Card object at 0x0376DE10>, <__main__.Card object at 0x0376DE30>, <__main__.Card object at 0x0376DE50>, <__main__.Card object at 0x0376DE70>, <__main__.Card object at 0x0376DE90>, <__main__.Card object at 0x0376DEB0>, <__main__.Card object at 0x0376DED0>, <__main__.Card object at 0x0376DEF0>, <__main__.Card object at 0x0376DF10>, <__main__.Card object at 0x0376DF30>, <__main__.Card object at 0x0376DF50>, <__main__.Card object at 0x0376DF70>, <__main__.Card object at 0x0376DF90>, <__main__.Card object at 0x0376DFB0>, <__main__.Card object at 0x0376DFD0>, <__main__.Card object at 0x0376DFF0>, <__main__.Card object at 0x03775030>, <__main__.Card object at 0x03775050>, <__main__.Card object at 0x03775070>, <__main__.Card object at 0x03775090>, <__main__.Card object at 0x037750B0>, <__main__.Card object at 0x037750D0>, <__main__.Card object at 0x037750F0>, <__main__.Card object at 0x03775110>, <__main__.Card object at 0x03775130>, <__main__.Card object at 0x03775150>, <__main__.Card object at 0x03775170>, <__main__.Card object at 0x03775190>, <__main__.Card object at 0x037751B0>, <__main__.Card object at 0x037751D0>, <__main__.Card object at 0x037751F0>, <__main__.Card object at 0x03775210>]

尽管如此,我还是想指出,
construct
方法是不必要的。它正在做
构造器应该做的工作,但用的方式远远不够直观。构造函数的要点是
构造
。想想如果你忘记调用
construct
,卡的状态会是什么。如果只使用构造函数,就不可能忘记

您几乎肯定应该去掉类的
套件
valit
字段。不要像那样将任意信息存储为实例变量。从
construct
返回一张卡,然后将返回的卡附加到
cards
。如果可能,将信息显式传递给函数,并从函数返回信息;不要依赖对象的背景状态。这可能不是你的问题,但是你的代码读起来很混乱。修复该问题可能会使问题变得更清楚。您可以在整个程序的
组中创建一个
对象。\uuu init\uuu()
。然后你继续按顺序将一张牌设置为每种价值和套装的组合。注意要点,jasonharper请原谅我没有正确理解术语。作为一个提示(因为我没有计算机来调试它,无论如何这都是离题的),注意黑桃是列表中的最后一个符号,王牌也是。这表明你在某个地方循环,但只保留最后的结果。在您修复将所有内容存储为对象中的实例成员之前,调试将变得不必要的复杂。@Carcigenicate是的,我收集了这么多,让我感到不安的是,卡在分配之前是如何正确打印的,而在分配发生后它又变成了其他东西。虽然我在数组中得到了一个“card”实例数组,但它的值却出人意料地不正确。在一个令人发狂的辉煌时刻,我昨天修复了这个问题(当时我清楚地知道是什么错了),结果却完全重建了它,并再次破坏了它。现在我完全被卡住了。对我来说,这应该行得通,但是不行(不是一直都是这样吗?)。非常感谢您为此付出的努力。现在,当你解释它的时候,它非常有意义。谢谢你的详细解释,非常感谢。我将处理构造函数,正如您所建议的,我将把所有相关的位放在它所属的init部分。构造函数构造的事实也很有意义!保重,伙计!
def construct(self):
    for value in self.card.values:
        for suit in self.card.suits:
            card = Card()
            card.construct(value, suit)

            self.cards.append(card)

    print(self.cards)
[<__main__.Card object at 0x0376DB90>, <__main__.Card object at 0x0376DBB0>, <__main__.Card object at 0x0376DBD0>, <__main__.Card object at 0x0376DBF0>, <__main__.Card object at 0x0376DC10>, <__main__.Card object at 0x0376DC30>, <__main__.Card object at 0x0376DC50>, <__main__.Card object at 0x0376DC70>, <__main__.Card object at 0x0376DC90>, <__main__.Card object at 0x0376DCB0>, <__main__.Card object at 0x0376DCD0>, <__main__.Card object at 0x0376DCF0>, <__main__.Card object at 0x0376DD10>, <__main__.Card object at 0x0376DD30>, <__main__.Card object at 0x0376DD50>, <__main__.Card object at 0x0376DD70>, <__main__.Card object at 0x0376DD90>, <__main__.Card object at 0x0376DDB0>, <__main__.Card object at 0x0376DDD0>, <__main__.Card object at 0x0376DDF0>, <__main__.Card object at 0x0376DE10>, <__main__.Card object at 0x0376DE30>, <__main__.Card object at 0x0376DE50>, <__main__.Card object at 0x0376DE70>, <__main__.Card object at 0x0376DE90>, <__main__.Card object at 0x0376DEB0>, <__main__.Card object at 0x0376DED0>, <__main__.Card object at 0x0376DEF0>, <__main__.Card object at 0x0376DF10>, <__main__.Card object at 0x0376DF30>, <__main__.Card object at 0x0376DF50>, <__main__.Card object at 0x0376DF70>, <__main__.Card object at 0x0376DF90>, <__main__.Card object at 0x0376DFB0>, <__main__.Card object at 0x0376DFD0>, <__main__.Card object at 0x0376DFF0>, <__main__.Card object at 0x03775030>, <__main__.Card object at 0x03775050>, <__main__.Card object at 0x03775070>, <__main__.Card object at 0x03775090>, <__main__.Card object at 0x037750B0>, <__main__.Card object at 0x037750D0>, <__main__.Card object at 0x037750F0>, <__main__.Card object at 0x03775110>, <__main__.Card object at 0x03775130>, <__main__.Card object at 0x03775150>, <__main__.Card object at 0x03775170>, <__main__.Card object at 0x03775190>, <__main__.Card object at 0x037751B0>, <__main__.Card object at 0x037751D0>, <__main__.Card object at 0x037751F0>, <__main__.Card object at 0x03775210>]
2♥ K♥ 3♥ J♥ 6♥ 5♣ 7♣ 7♦ 8♣ 5♦ 3♣ Q♥ 10♣ 9♣ 9♥ A♦ 8♥ 9♠ 6♠ A♠ K♣ K♠ J♦ 2♦ 7♥ 10♠ 6♦ 6♣ 4♠ 5♠ K♦ 3♦ 4♥ 9♦ Q♠ 7♠ A♣ 4♣ 10♦ A♥ Q♦ 4♦ 5♥ J♣ 8♠ 3♠ J♠ Q♣ 8♦ 10♥ 2♣ 2♠