我知道其他一些语言,如PHP,支持“变量变量名”的概念——也就是说,字符串的内容可以用作变量名的一部分。

我听说这通常是一个坏主意,但我认为它可以解决我的Python代码中的一些问题。

在Python中可以做这样的事情吗?会出什么问题?


如果您只是试图通过名称查找现有变量,请参见如何通过(字符串)名称选择变量。但是,首先考虑是否可以按照这个问题中的建议重新组织代码以避免这种需要。


当前回答

我回答的问题如何得到一个变量的值给定它的名字在一个字符串? 这是一个带有问题链接的副本。(编者注:它现在被关闭为“如何通过(字符串)名称选择变量?”的副本?)


如果所讨论的变量是对象的一部分(例如类的一部分),则可以使用hasattr、getattr和setattr函数来实现这一点。

例如,你可以有:

class Variables(object):
    def __init__(self):
        self.foo = "initial_variable"

    def create_new_var(self, name, value):
        setattr(self, name, value)

    def get_var(self, name):
        if hasattr(self, name):
            return getattr(self, name)
        else:
            raise "Class does not have a variable named: " + name

然后你可以这样做:

>>> v = Variables()
>>> v.get_var("foo")
'initial_variable'
>>> v.create_new_var(v.foo, "is actually not initial")
>>> v.initial_variable
'is actually not initial'

其他回答

任何一组变量也可以包装在一个类中。 “变量”变量可以在运行时通过__dict__属性直接访问内置字典添加到类实例中。

下面的代码定义了Variables类,它在构造过程中将变量(在本例中是属性)添加到其实例中。变量名取自指定的列表(例如,可以由程序代码生成):

# some list of variable names
L = ['a', 'b', 'c']

class Variables:
    def __init__(self, L):
        for item in L:
            self.__dict__[item] = 100

v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100

这应该是非常危险的…… 但是你可以使用exec():

a = 'b=5'
exec(a)
c = b*2
print (c)

结果: 10

setattr()方法设置指定对象的指定属性的值。

语法是这样的-

setattr(object, name, value)
Example –

setattr(self,id,123)

它等价于self。Id = 123

正如您可能已经观察到的,setattr()期望将一个对象与值一起传递,以生成/修改一个新属性。

我们可以将setattr()与一个解决方案一起使用,以便能够在模块中使用。这里怎么——

import sys
x = "pikachu"
value = 46
thismodule = sys.modules[__name__]
setattr(thismodule, x, value)
print(pikachu)

我回答的问题如何得到一个变量的值给定它的名字在一个字符串? 这是一个带有问题链接的副本。(编者注:它现在被关闭为“如何通过(字符串)名称选择变量?”的副本?)


如果所讨论的变量是对象的一部分(例如类的一部分),则可以使用hasattr、getattr和setattr函数来实现这一点。

例如,你可以有:

class Variables(object):
    def __init__(self):
        self.foo = "initial_variable"

    def create_new_var(self, name, value):
        setattr(self, name, value)

    def get_var(self, name):
        if hasattr(self, name):
            return getattr(self, name)
        else:
            raise "Class does not have a variable named: " + name

然后你可以这样做:

>>> v = Variables()
>>> v.get_var("foo")
'initial_variable'
>>> v.create_new_var(v.foo, "is actually not initial")
>>> v.initial_variable
'is actually not initial'

我已经尝试了python 3.7.3,你可以使用globals()或vars()

>>> food #Error
>>> milkshake #Error
>>> food="bread"
>>> drink="milkshake"
>>> globals()[food] = "strawberry flavor"
>>> vars()[drink] = "chocolate flavor"
>>> bread
'strawberry flavor'
>>> milkshake
'chocolate flavor'
>>> globals()[drink]
'chocolate flavor'
>>> vars()[food]
'strawberry flavor'

参考: https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936