在类Python之外的类中使用修改的变量

时间:2018-09-07 22:06:50

标签: python list class namespaces pop

当某人初次接触课程时,我觉得这肯定是一个相当普遍的问题,但我找不到答案。我正在尝试制作二十一点游戏,而评估的一部分是使用类完成交易过程。我为此使用的代码如下:

class Deal:

    def __init__(self,shuffled_deck,dealt_card):
        self.shuffled_deck = shuffled_deck
        self.dealt_card = dealt_card
    def dealing(self):
        dealt_card = []
        dealt_card += shuffled_deck.pop(0)
        print(dealt_card)

#Dealing the first round of cards

for name in player_hand:
    Deal(shuffled_deck,dealt_card).dealing()
    player_hand[name] += dealt_card

以供参考:

  • shuffled_deck是牌组中随机排列的牌列表
  • dealt_card最初是一个空列表

我想要做的是弹出卡列表中的第一项,并将其设置为与dealt_card相等。然后,我想将Dealt_card添加到当前的玩家手中-这是字典中的key:list对。然后,我希望它对字典中的每个玩家重复此过程。

这不是我要理解的-调用Deal()类会导致shuffled_deck被修改,并且更改也发生在类之外。但是,对Dealt_card变量的修改发生在类内,但在类外则保留为空列表。为什么只将类所做的更改的一半转移到其外部的命名空间?

3 个答案:

答案 0 :(得分:0)

dealing()方法中,由于要调用self.shuffled_deck的实例,因此需要使用dealt_card += self.shuffled_deck.pop(0)(即Deal)。

此外,您可能想将每个玩家的Deal分配给一个变量,以便跟踪变量,例如player_deal[name] = Deal(shuffled_deck,dealt_card)或类似的东西?

答案 1 :(得分:0)

  

您的变量shuffled_deck和dealt_card都是在不同范围内的单独变量...

    class Deal:
    def __init__(self,shuffled_deck,dealt_card):
        self.shuffled_deck = shuffled_deck
        self.dealt_card = dealt_card
  

这是两个不同的变量self.shuffled_deck(全局类)和shuffled_deck>(本地)来自init函数-与dealt_card相同-很好。

    def dealing(self):
        dealt_card = []
        dealt_card += shuffled_deck.pop(0)
        print(dealt_card)
  

dealt_card是您刚刚为交易方法定义的全新LOCAL变量。   shuffled_deck也是,尽管您没有定义它...所以应该给出错误。   我想你要在这里self.shuffled_deck。

    #Dealing the first round of cards
    for name in player_hand:
        Deal(shuffled_deck,dealt_card).dealing()
        player_hand[name] += dealt_card
  

在这里您尚未定义shuffled_deck和dealt_card的位置,但随后将它们传递给类的init函数。

     

因此,当您要引用包含在甲板上的类时,请在类方法中使用self.shuffled_deck。

答案 2 :(得分:0)

以下是一个示例功能,可用来发5张牌扑克:

import random
class Deck:
    def __init__(self,**players):
        self.ranks   = [str(i) for i in range(2,11)] + ['J','Q','K','A']
        self.suits   = 'HDCS'
        self.deck    = [(s,r) for s in self.suits for r in self.ranks]
        self.players = players

    def deal(self):
        random.shuffle(self.deck)
        for player in self.players:
            self.players[player] = [] # empty hands on each deal
            for i in range(5):
                try:
                    card = self.deck.pop()
                    self.players[player].append(card)
                except IndexError:
                    print('Deck ran out! - reshuffling new deck...')
                    self.deck = [(s,r) for s in self.suits for r in self.ranks]
                    self.deal()

Deck = Deck(player1=[],player2=[],player3=[])
Deck.deal()
print(Deck.players)

这里的主要区别是,与您的版本相比,每个游戏套牌仅创建一次(如果套牌用完,则会创建一个新套牌,并将其重新洗牌)。这是因为Deck仅实例化一次,而您的版本每次尝试发卡时都会创建Deal个实例。

我还假设您打算为每位玩家全手(而不是一张牌),因此在上面的deal方法中,依次向每位玩家分发了5张牌,并且玩家字典为进行了相应更新,以反映出这些已发牌。