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

问题描述 投票:0回答:3

我觉得当有人第一次掌握课程时,这一定是一个相当普遍的问题,但我无法找到答案。我正在尝试制作二十一点游戏,部分评估是使用一个类来完成交易过程。我正在使用的代码如下:

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是随机顺序中卡片中的卡片列表
  • processed_card最初是一个空列表

我想要做的是关闭卡片列表中的第一项并将其设置为等于dealing_card。然后我想将processed_card添加到当前的player_hand中 - 这是一个关键:dictonary中的列表对。然后我想让它为字典中的每个玩家重复这个过程。

我没有理解这一点 - 调用类Deal()导致shuffled_deck被修改,并且更改也发生在类外。然而,processed_card变量的修改发生在类中,但在类之外它仍然是一个空列表。为什么只有一半的更改由类转移到它之外的命名空间?

python list class namespaces pop
3个回答
0
投票

dealing()方法中,你需要使用self.shuffled_deck(即dealt_card += self.shuffled_deck.pop(0)),因为你正在调用Deal的实例。

此外,你可能想要将每个玩家的交易分配给一个变量,以便跟踪它,比如player_deal[name] = Deal(shuffled_deck,dealt_card)或沿着这些线的东西?


0
投票

你的变量shuffled_deck和dealing_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函数 - 与processed_card相同 - 这很好。

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

processed_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和dealing_card的位置,但是这些是传递给类的init函数的......

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


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张牌,并相应地更新玩家字典以反映那些发牌。

© www.soinside.com 2019 - 2024. All rights reserved.