我正在尝试找到一种安全的好方法来使用字符串替换来调用变量以设置其值。这是更多的最佳实践,我正在寻找执行此操作的最佳方法。
首先,使用字典或类似结构不是我想要的。我想设置一个变量的值!
例子;
def test_my_var(name_param, val):
# Set initial values for each variable
my_var_1 = -1
my_var_2 = -1
my_var_3 = -1
...
my_var_n = -1
# Now I will update the value of mth variable
my_var_%{name_param}s = val # Of course this will not work!!
# Now print the new value of this variable
print my_var_%{name_param}s
我正在寻找一种实用的方法来实现这一目标。经过测试但不起作用的是:
我不想将我的变量保存在字典或类似的结构中。它们是函数内的局部变量,应该保持原样。
我不喜欢使用 exec,因为它会执行发送的任何命令!所以下面不是一个好的方法,也不是一个有效的方法。
def test_case(index, val):
var_1 = -1
var_2 = -1
exec("var_%s" = %s % (index, val))
print eval("var_%s" % index)
测试了使用 locals() 和设置值的方法,但未能这样做
def test_case(index, val):
val_1 = -1
val_2 = -1
print locals()["val_%s" % index]
locals()["val_%s" % index] = val
print val_1, val_2 # That will not update the calue of the variable `val_1` or any other variable
所以我正在寻找一种聪明的方法来更改变量的值,其中变量名称将表示为字符串替换。
请您参考如下方法:
你不能为所欲为,不在你设定的约束范围内。
那是因为 locals() 不是事件对象。 CPython 使用 C 数组作为局部变量,字节码使用索引来访问它们。 locals() 字典是一种方便的调试工具,它将存储的本地名称列表与数组引用的值配对。尝试改变该字典不会更新实际的局部变量数组。
如您所见,exec 确实有效,因为 Python 2 在这种情况下禁用了对局部变量的优化,并且在您将 exec 添加到组合中时使用了较慢的技术。在 Python 3 中,exec() 不再是一个语句而是一个函数,这个漏洞被堵上了。
参见 globals() vs locals() mutability和 Behavior of exec function in Python 2 and Python 3 .
因此,如果您真的在寻找最佳实践,请坚持使用字典或列表。这些也是局部变量,但是您实际上可以通过字符串键或整数索引来寻址其中的值。
