【问题标题】:generating variable names on fly in python [duplicate]在python中动态生成变量名[重复]
【发布时间】:2011-04-29 23:28:12
【问题描述】:

有没有一种方法可以在 python 中循环生成变量名并为其赋值?例如,如果我有

prices = [5, 12, 45]

我想要

price1 = 5
price2 = 12
price3 = 45

我可以循环执行此操作,而不是手动分配price1 = prices[0]price2 = prices[1] 等。

谢谢。

编辑

很多人建议我写一个要求这个的理由。首先,有时我认为这可能比使用列表更方便......我不记得确切的时间,但我想当有很多嵌套级别时我已经考虑过使用它。例如,如果一个人有一个列表列表,以上述方式定义变量可能有助于降低嵌套级别。其次,今天我在尝试学习Pytables的使用时想到了这一点。刚接触Pytables,看到在定义表的结构时,列名和类型是这样描述的:

class TableFormat(tables.IsDescription):
    firstColumnName = StringCol(16)
    secondColumnName = StringCol(16)
    thirdColumnName = StringCol(16)

如果我有 100 列,明确键入每列的名称似乎需要做很多工作。所以,我想知道是否有办法即时生成这些列名。

【问题讨论】:

  • 你为什么要这样做?
  • 男人发明了列表......所以你不必这样做。
  • 这是一个主要的代码气味!你在这里的目标是什么?拿到“price94”后你打算怎么办?
  • 是这样的用例:您有一些代码可以接受一些数据并对其进行处理,输出是,例如,Y 的一些预测值?而且您不知道需要多少预测值(以及 t/4 多少变量分配),因为这取决于输入数组的大小,可能会有所不同)。
  • 另一个用例,元编程。 github.com/apache/incubator-airflow 像这样创建 DAG,github.com/apache/incubator-airflow/blob/master/airflow/…。如果要创建上游或下游依赖项,请通过分配的变量名来完成。

标签: python


【解决方案1】:

如果您真的想即时创建它们,您可以分配给 globals()locals() 返回的字典,具体取决于您要在哪个命名空间中创建它们:

globals()['somevar'] = 'someval'
print somevar  # prints 'someval'

但我不建议这样做。一般来说,避免使用全局变量。使用locals() 通常只会掩盖你真正在做什么。相反,创建您自己的 dict 并分配给它。

mydict = {}
mydict['somevar'] = 'someval'
print mydict['somevar']

学习蟒蛇禅;运行它并很好地理解它:

>>> import this

【讨论】:

【解决方案2】:

虽然我看不出有什么意义,但这里是:

for i in xrange(0, len(prices)):
    exec("price%d = %s" % (i + 1, repr(prices[i])));

【讨论】:

  • 生成代码的缩进是多少?它是什么时候生成的?无法使其在 Django 项目中工作
  • 哦,你的意思是生成实际代码而不是执行每个单独的事情?只需将 exec() 替换为 print() 即可。
  • 使用 repr() 的目的是什么?
  • @Bodhidarma:参见描述 in Python docs --- repr() 尝试返回一个值,当传递给 eval()(或在本例中为 exec())时,会产生一个对象相同的值。如果是字符串,它会正确地转义它们。 这么说,您实际上不应该使用上面的代码(Python 有一个非常好的概念来表示一堆变量 --- 列表!)。
  • 请注意,这在函数中是行不通的——至少今天不行,不记得它在黑暗时代是否可行。由于大多数 Python 代码可能不应该处于模块级别,因此它不适用于大多数代码所在的位置。
【解决方案3】:

在一个对象上,您可以使用setattr 实现此目的

>>> class A(object): pass
>>> a=A()
>>> setattr(a, "hello1", 5)
>>> a.hello1
5

【讨论】:

  • 获取属性列表:“a.__dict__.keys()”或完整的字典“a.__dict__”
【解决方案4】:

我有你的问题,这是我的答案:

prices = [5, 12, 45]
list=['1','2','3']

for i in range(1,3):
  vars()["prices"+list[0]]=prices[0]
print ("prices[i]=" +prices[i])

所以在打印时:

price1 = 5 
price2 = 12
price3 = 45

【讨论】:

  • 这不起作用。
  • 这里有多个错误,但这种方法并非完全有缺陷;您可以分配 vars()["prices"+str(i)] 并拥有一个具有预期名称的变量。
  • 是的,有一些错误,但这有效:prices = [5, 12, 45]list=['_a','_b','_c']for i in range(0,3):vars()["prices"+list[i]]= prices[i]vars()["prices"+list[i]]= prices[i]print (prices_a)print (prices_b)print (prices_c)
【解决方案5】:

另一个例子,它实际上是another answer 的变体,因为它也使用字典:

>>> vr={} 
... for num in range(1,4): 
...     vr[str(num)] = 5 + num
...     
>>> print vr["3"]
8
>>> 

【讨论】:

  • 你如何修改vr?您的解决方案违背了整个目的。我正在从网络上抓取数据,我需要为每个容器项目创建一个类的实例,并且容器项目的数量是未知的......就像this thread that i created中的问题2@
  • @Anthony 我在这里回答的问题比您所链接的问题更加集中。我对这个问题没有任何建议。
  • 它基本上是相同的上下文。我指的是最底部那个线程中的“问题#2”......
  • 但这严格来说并不是动态赋值的变量,只是一个字典。
【解决方案6】:

有点长,我猜它可以工作......

prices = [5, 12, 45]
names = []
for i, _ in enumerate(prices):
    names.append("price"+str(i+1))
dict = {}
for name, price in zip(names, prices):
    dict[name] = price
for item in dict:
    print(item, "=", dict[item])

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 2021-09-03
    • 2014-01-06
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2013-08-11
    相关资源
    最近更新 更多