Назначьте сразу несколько переменных с именами динамических переменных
Я знаю, что могу сразу назначить несколько переменных нескольким значениям:
(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))
И есть то же самое?
Ответы
Ответ 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