Назначить несколько переменных одновременно с динамическими именами переменных - PullRequest
20 голосов
/ 11 марта 2011

Я знаю, что могу назначить несколько переменных одновременно нескольким значениям с помощью:

(foo, bar, baz) = 1, 2, 3

И иметь foo = 1, bar = 2 и т. Д.

Но какМогу ли я сделать имена переменных более динамичными?Т.е.

somefunction(data,tupleofnames):
    (return that each name mapped to a single datum)

somefunction((1,2,3),(foo,bar,baz))     

А есть то же самое?

Ответы [ 7 ]

13 голосов
/ 11 марта 2011

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

Например, вы можете вернуть словарь: {"foo":1, "bar":2, "baz":3}

10 голосов
/ 11 марта 2011

Как насчет этого?

def somefunction(data, tupleofnames):
    length = len(tupleofnames)
    for i in range(0, length):
        globals()[tupleofnames[i]] = data[i]

Здесь я предполагаю, что как data, так и tupleofnames являются списками, где tupleofnames является списком строк. Но, как сказал Томас, это не очень хорошая практика. Это может легко испортить ваше приложение.

6 голосов
/ 11 марта 2011

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

http://docs.python.org/library/collections.html#collections.namedtuple

from collections import namedtuple


mytype = namedtuple("mytype", "foo bar baz")

a = mytype(1,2,3)
a.foo
1
a.bar
2
a.baz
 3
5 голосов
/ 05 февраля 2014

Вы можете сделать это так:

    (foo, bar, baz) = (1, 2, 3)
3 голосов
/ 11 марта 2011

Проверьте справочные документы для zip & map.Например, для zip: -

>>>  zip( (1,2,3) , ('foo','bar','baz') )
[(1, 'foo'), (2, 'bar'), (3, 'baz')] 

Для отображения требуется последовательность функций.Но вы можете использовать None вместо функции, чтобы возвращать те же результаты, что и zip выше.

>>> map( None, (1,2,3) , ('foo','bar','baz') )                                                                                       
[(1, 'foo'), (2, 'bar'), (3, 'baz')]
0 голосов
/ 04 мая 2016

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

кортеж T

T = (A, B, C)

переменные

var1, var2, var3 = T

0 голосов
/ 14 апреля 2016
(foo, bar, baz) = [None] * 3    
a,b,c = [0]*3    
a,b,c = ["nihao"]*3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...