Использование переменной, измененной внутри класса вне класса Python
Я чувствую, что это должно быть довольно распространенной проблемой, когда кто-то впервые начинает заниматься с классами, но я не могу найти ответ на этот вопрос. Я пытаюсь сделать игру в блэкджек, и часть оценки заключается в том, чтобы завершить процесс сделки с помощью класса. Код, который я использую для этого ниже:
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 в текущий player_hand - это пара ключ: список в диктоннике. Затем я хочу повторить этот процесс для каждого игрока в словаре.
Что я не понимаю, так это то, что вызов класса Deal() приводит к изменению shuffled_deck и к изменениям, происходящим вне класса. Однако изменение переменной dealt_card происходит внутри класса, но вне класса оно остается в виде пустого списка. Почему только половина изменений, внесенных классом, переносится в пространство имен вне его?
3 ответа
Ваши переменные 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 - это совершенно новая локальная переменная, которую вы только что определили для дилингового метода. 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 в методах класса, когда вы хотите сослаться на класс, содержащий колоду.
Вот пример функции для раздачи рук в 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 карт раздаются каждому игроку по очереди, и словарь игрока обновляется соответствующим образом, чтобы отразить эти карты.
В dealing()
метод, вам нужно использовать self.shuffled_deck
(то есть, dealt_card += self.shuffled_deck.pop(0)
) так как вы называете экземпляр Deal
,
Кроме того, вы можете назначить сделку каждого игрока для переменной, чтобы отслеживать его, скажем, player_deal[name] = Deal(shuffled_deck,dealt_card)
Или что-то вдоль этих линий?