список имен с аргументом функции в python - PullRequest
1 голос
/ 01 февраля 2009

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

, например

def make_hand(deck, handname):
    handname = []
    for c in range(5):
        handname.append(deck.pop())
    return handname

    # deck being a list containing all the cards in a deck of cards earlier

Проблема в том, что это создает список с именем handname, когда я хочу, чтобы он вызывался независимо от того, что пользователь вводит как handname при создании руки.

Кто-нибудь может помочь? спасибо

Ответы [ 2 ]

6 голосов
/ 01 февраля 2009

Вы можете хранить словарь, где ключи - это имя руки, а значения - список.

Тогда вы можете просто произнести словарь [handname], чтобы получить доступ к конкретной руке. По линиям:

hands = {} # Create a new dictionary to hold the hands.
hands["flush"] = make_hand(deck) # Generate some hands using your function.
hands["straight"] = make_hand(deck) # Generate another hand with a different name.
print hands["flush"] # Access the hand later.
2 голосов
/ 01 февраля 2009

Хотя вы можете создавать переменные с произвольными именами во время выполнения, используя exec (как предложил sykora) или вмешиваясь с locals, globals или setattr для объектов, ваш вопрос несколько спорен.

Объект (почти все, от целых чисел до классов с 1000 членами) - это просто кусок памяти. У него нет a имени, оно может иметь произвольное количество имен, и все имена обрабатываются как равные: они просто вводят ссылку на некоторый объект и предотвращают его сбор.

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

Ваш подход к предоставленным пользователем именам переменных имеет несколько других серьезных последствий: Что делать, если пользователь вводит имя существующей переменной? * что если пользователь введет неверное имя?

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

...