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

Posted

技术标签:

【中文标题】使用动态变量名称一次分配多个变量【英文标题】:Assign multiple variables at once with dynamic variable names 【发布时间】:2011-07-13 11:31:22 【问题描述】:

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

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

有同样的吗?

【问题讨论】:

像这样 (foo, bar, baz = 1,2,3) 这样分配变量的行为叫什么? (而不是分配 foo = 1,bar = 2,baz = 3)。谢谢! 嗨@sindhus!它被称为“解构赋值”。 Python 有一段时间了,最​​近它被添加到 javascript 中。 【参考方案1】:

有一些方法可以做到这一点,但它们不是很好的方法,并且在 Python 中被认为是不好的做法。新变量不应该被魔法创造出来。如果您想拥有事物的集合,请酌情使用列表、字典或集合。

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

【讨论】:

【参考方案2】:

这个怎么样?

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

这里我假设 data 和 tupleofnames 都是列表,其中 tupleofnames 是字符串列表。但正如托马斯所说,这不是一个好的做法。它很容易损坏您的应用程序。

【讨论】:

经过深思熟虑:虽然我理解分配看似任意的变量名称可能是一个坏主意,但我喜欢这个答案,因为它表明这是可能的(而且我的兴趣主要是学术性的)。感谢您的回答!【参考方案3】:

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

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)

【讨论】:

甚至(foo, bar, baz) = [None] * 3 这似乎在功能上与问题中的第一行代码相同,并且绝对不涉及动态变量名称 - 您是否阅读过问题正文的任何​​部分,或者只是标题?还是我错过了什么?【参考方案5】:

查看 zip 和 map 的帮助文档。 例如对于邮编:-

>>>  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')]

【讨论】:

这里使用地图有什么意义?这正是zip 的用途!【参考方案6】:
(foo, bar, baz) = [None] * 3    
a,b,c = [0]*3    
a,b,c = ["nihao"]*3

【讨论】:

【参考方案7】:

我知道上面的答案已经是他们所需要的,但我有一个很酷的编程技巧,当你想将一个特定的元组分配给变量时,它也可以帮助你。

元组 T

T = (A,B,C)

变量

var1, var2, var3 = T

【讨论】:

以上是关于使用动态变量名称一次分配多个变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中使用动态名称分配变量

一次为多个变量分配相同的值?

动态 Freemarker 变量名

在IAR v8.11中,是否有用于构建配置的预定义变量名称?

58 动态内存分配

如何在不使用游标的情况下一次将查询结果分配给多个变量?