我正在尝试改进我现有的代码,有没有办法在不使用字典或列表或元组的情况下影响多个不同的变量? 我正在尝试写类似的东西:
number1 = 1
number2 = 2
number3 = 3
for i in (1,2,3):
number{i} += 1
然后有 number1 = 2 number2 = 3 和 number3 = 4
我正在考虑格式化字符串,但它不起作用,谢谢阅读。
这里更好的方法是使用字典:
In [26]: numbers={'number1': 1,
....: 'number2' : 2,
....: 'number3' : 3}
In [27]: for i in (1,2,3):
....: numbers['number'+str(i)]+=1
....:
In [28]: numbers['number1']
Out[28]: 2
In [29]: numbers['number2']
Out[29]: 3
In [30]: numbers['number3']
Out[30]: 4
否则你也可以globals()
:
In [31]: number1 = 1
In [32]: number2 = 2
In [33]: number3 = 3
In [34]: for i in (1,2,3):
....: globals()['number'+str(i)]+=1
....:
....:
In [35]: number1
Out[35]: 2
In [36]: number2
Out[36]: 3
In [37]: number3
Out[37]: 4
您可以使用返回的字典通过其名称的字符串表示形式访问变量,globals()
或者locals()
根据需要使用返回的字典 - 尽管您可能会发现,如果修改locals()
字典,事情的行为不会像您预期的那样,如文档中所述并由代码片段演示在这个答案的底部。您还可以通过字符串标签分别使用 来修改实例、类或模块变量setattr(self, 'some_variable_name', value)
,setattr(ClassName, 'some_variable_name', value)
或者setattr(ModuleName, 'some_variable_name', value)
其中 self、ClassName 和 ModuleName 分别是对类实例、类和模块的引用。exec
最后,您总是可以通过执行包含在字符串中的代码来实现您想要的。例如:
for i in range(5):
temp = i
exec('var%d = temp' % i)
print var0, var1, var2, var3, var4
将打印0 1 2 3 4
。
但是你到底为什么想做这些事情呢?如果您需要将任意字符串映射到值,则可以创建并使用字典。如果像在您的示例中那样,您不是在处理任意字符串,而是在处理仅在名称末尾有一个整数索引不同的变量序列,那么请使用列表,因为这就是列表的用途。
以我在第一段中描述的任何方式做事都是令人困惑和毫无意义的,我从未见过在实际代码中这样做过。
我想再次强调这里的重要一点,正如 Ashwini Chaudhary 已经指出的那样,没有理由以这种方式通过字符串引用变量,因为如果您需要将字符串映射到值,您可以简单地使用dictionary - 如果你使用globals()
or ,这正是你间接做的事情locals()
,因为这些函数每个都返回字典。
无论如何,作为附言,我提到如果您修改 locals() 字典,事情就不太正常了,这并不意味着按照文档中的说明进行修改,这说明
Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.
好吧,这里有一个关于这一点的说明,它可能会阻止任何人尝试这种方法:
var1 = 'asdf'
def test1():
var1 = 'ghjkl'
print globals()['var2']
print locals()['var2']
test1()
def test2():
globals()['var2'] = 'qwerty'
locals()['var2'] = 'uiop'
print var2
test2()
如果你运行上面的代码会打印什么?令我惊讶的是,它是:
asdf
ghjkl
qwerty
第一个测试的行为与我预期的一样——全局查找找到函数外部分配的值,本地查找查找本地分配的值。第二个测试是令人惊讶的 - 即使我们已经在全局变量中分配了一个值,在本地变量中分配了一个值,但通过名称在本地引用变量会找到我们放在全局字典中的值,而不是本地字典中的值。