Подтвердить что ты не робот

Назначьте сразу несколько переменных с именами динамических переменных

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

(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))     

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Если словари не то, что вы хотите, возможно, 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

Ответ 4

Вы можете сделать это следующим образом:

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

Ответ 5

Ознакомьтесь с документами справки для 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')]

Ответ 6

(foo, bar, baz) = [None] * 3    
a,b,c = [0]*3    
a,b,c = ["nihao"]*3

Ответ 7

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

tuple T

T = (A, B, C)

переменные

var1, var2, var3 = T