我试图找到一种使用字符串替换调用变量的好方法,以便设置其值。这是一种更好的做法,我正在寻找最佳方法。
首先,使用字典或类似结构不是我想要的。我希望设置一个变量的值!
实施例
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
我正在寻找一种切实可行的方法来实现这一目标。经过测试但不起作用的是:
我不想让我的vars保持dict或类似的结构。它们是函数内部的局部变量,它们应保持原样。
使用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
所以我正在寻找一种更改变量值的智能方法,其中变量名称将表示为字符串替换。
答案 0 :(得分:6)
你无法做到你想要的,而不是你设定的限制。
那是因为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。
因此,如果您真的在寻找最佳实践,请坚持使用字典或列表。这些是本地太,但您可以通过字符串键或整数索引实际处理这些值。