如何创建可变变量?

551 投票
18 回答
263910 浏览
提问于 2025-04-15 14:03

我知道有些其他编程语言,比如PHP,支持一种叫“变量变量名”的概念,也就是说,你可以用字符串的内容来作为变量名的一部分。

我听说这通常不是个好主意,但我觉得这样可以解决我在Python代码中遇到的一些问题。

在Python中可以这样做吗?会有什么问题呢?


如果你只是想通过名字来查找一个已经存在的变量,可以看看如何通过(字符串)名字选择变量?。不过,首先考虑一下是否可以重新组织代码,避免这种需求,参考这个问题中的建议。

18 个回答

95

这样做不是个好主意。如果你想访问一个全局变量,可以使用 globals()

>>> a = 10
>>> globals()['a']
10

如果你想访问一个在本地范围内的变量,可以使用 locals(),不过你不能给返回的字典赋值。

更好的解决办法是使用 getattr,或者把你的变量放在一个字典里,然后通过名字来访问它们。

117

使用内置的 getattr 函数可以通过名字获取对象的属性。你可以根据需要修改这个名字。

obj.spam = 'eggs'
name = 'spam'
getattr(obj, name)  # returns 'eggs'
440

你可以使用字典来实现这个功能。字典是存储键和值的地方。

>>> dct = {'x': 1, 'y': 2, 'z': 3}
>>> dct
{'x': 1, 'y': 2, 'z': 3}
>>> dct["y"]
2

你可以使用变量作为键名,这样就能实现类似变量变量的效果,而且没有安全风险。

>>> x = "spam"
>>> z = {x: "eggs"}
>>> z["spam"]
'eggs'

如果你考虑做一些像下面这样的事情

var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...

那么列表可能比字典更合适。列表表示一个有序的对象序列,使用整数索引来访问:

lst = ['foo', 'bar', 'baz']
print(lst[1])           # prints bar, because indices start at 0
lst.append('potatoes')  # lst is now ['foo', 'bar', 'baz', 'potatoes']

对于有序的序列,列表比使用整数键的字典更方便,因为列表支持按索引顺序遍历、切片append等操作,而这些在字典中管理键会比较麻烦。

撰写回答