在Python中动态生成变量名

77 投票
6 回答
141326 浏览
提问于 2025-04-16 06:01

有没有办法在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列,逐个输入每个列名看起来工作量很大。所以,我想知道有没有办法动态生成这些列名。

6 个回答

26

在一个对象上,你可以使用 setattr 来实现这个功能。

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

虽然我觉得这没什么意义,但还是给你看看:

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

如果你真的想动态创建变量,可以使用 globals()locals() 来获取一个字典,然后把新变量放进去,这取决于你想在哪个命名空间里创建它们:

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

不过我不建议这样做。一般来说,尽量避免使用全局变量。使用 locals() 往往会让你搞不清楚自己在做什么。更好的做法是自己创建一个字典,然后把变量放进去。

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

了解一下 Python 的哲学,运行这个代码,仔细体会一下:

>>> import this

撰写回答