Как мне сделать переменную из строки глобальной в Python? - PullRequest
0 голосов
/ 29 сентября 2011

Я пытаюсь сделать игру в блэкджек.Я сделал функции для рисования карт и проверки, если сумма в руке превышает 21, но только для 3 игроков.Это было легко, у меня было 3 списка.

Но я хочу сделать это для N игроков, поэтому я хочу сохранить свои функции и создать еще один, который будет переключаться между игроками и их руками.

def create_hands():
global total_players
for x in range(1, total_players+1):
    vars()["hand_%d" % x] = []
    print hand_1

Я хочу создать столько же рук, сколько в hand_1, hand_2 и т. Д. ... для такого количества N игроков (total_players)

Из-за кода, приведенного выше, я получаю глобальное имя 'hand_1'не определено ошибка

Так что все сводится к:

  1. Как мне сделать "hand_% d"% x глобальным?

  2. Есть ли лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Да, есть лучший способ. Просто создайте список списков. Игра с переменными должна быть опущена, если это возможно. Это действительно трудно читать и отлаживать, и вы будете сожалеть об этом в последнее время. Когда вы создадите список типа players -> hand -> cards или даже список игроков, например players['player1'][3], для одной третьей карты игрока, вы будете гораздо более довольны этим.

0 голосов
/ 08 июля 2013

Да, возможно . Заменить

vars()["hand_%d" % x] = []

с

globals()["hand_%d" % x] = []

Имейте в виду, однако, что это решение довольно хакерское и может легко привести к проблемам (трудности в обслуживании, потеря отслеживания спонтанно созданных переменных и т. Д.)

0 голосов
/ 29 сентября 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что vars () является псевдонимом для locals (), который имеет следующий комментарий в официальной документации:

Note: The contents of this dictionary should not be modified; 
changes may not affect the values of local and free variables 
used by the interpreter.

Другими словами, добавление ключей к vars () НЕ обязательно обновляет таблицу локальных переменных (именно поэтому вы получаете ошибку global name hand_1 is not defined - vars()[ "hand_1" ] не превращает hand_1 в локальную переменную).

Как упоминал Ганди, есть гораздо более простые способы сделать то, что вы пытаетесь сделать - использовать список списков или что-то подобное.Есть гораздо более традиционные способы решения этой проблемы, чем создание локальных переменных с произвольными именами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...