【问题标题】: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 中。

标签: python mass-assignment destructuring


【解决方案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

        【讨论】:

          猜你喜欢
          • 2021-08-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          相关资源
          最近更新 更多