我正在尝试改进我现有的代码,有没有办法在不使用字典或列表或元组的情况下影响不同变量的倍数? 我想写一些类似的东西:
number1 = 1
number2 = 2
number3 = 3
for i in (1,2,3):
number{i} += 1
然后有number1 = 2 number2 = 3和number3 = 4
我正在考虑格式化字符串,但它不起作用,thx用于阅读。
答案 0 :(得分:3)
这里更好的方法是使用字典:
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
答案 1 :(得分:3)
您可以根据需要使用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已经指出的那样,重要的是,没有理由以这种方式通过字符串引用变量,因为如果你需要将字符串映射到值,您可以简单地使用字典 - 如果您使用globals()
或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
第一个测试的行为与我期望的一样 - 全局变量中的查找找到在函数外部分配的值,并且本地中的查找找到本地分配的值。第二个测试是令人惊讶的 - 尽管我们已经在全局变量中分配了一个值,在本地变量中赋值,但是在本地引用变量的名称会找到我们放在 globals 字典中的值,而不是当地人一个。