使用动态变量名一次分配多个变量

时间:2011-03-11 12:41:32

标签: python mass-assignment destructuring

我知道我可以一次为多个值分配多个变量:

(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 个答案:

答案 0 :(得分:13)

有很多方法可以做到这一点,但它们并不是很好的方式,而且在Python中被认为是不好的做法。不应该通过魔法创建新变量。如果您想拥有一系列内容,请根据需要使用列表,字典或集合。

例如,您可以返回字典:{"foo":1, "bar":2, "baz":3}

答案 1 :(得分:10)

这个怎么样?

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

这里我假设数据和元组名都是tupleofnames是字符串列表的列表。但正如托马斯所说,这不是一个好习惯。它很容易破坏你的应用程序。

答案 2 :(得分:6)

如果字典不是你想要的,那么可能是名字元组: 它们允许有效地创建组合在一起的多个数据实例, 具有命名属性。

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

答案 3 :(得分:5)

你可以这样做:

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

答案 4 :(得分:3)

查看zip& amp;帮助文档。地图。 例如用于拉链: -

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

map需要一个函数来将序列映射到一起。但是,您可以使用None而不是函数来返回与上面的zip相同的结果。

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

我理解上面的答案已经是他们所需要的全部,但我有一个很酷的编程技巧,当你想要为变量分配一个特定的元组时,它也可以帮到你。

tuple T

T =(A,B,C)

变量

var1,var2,var3 = T