更改局部变量的值,其中变量名称将表示为字符串

时间:2015-09-07 13:39:14

标签: python python-2.7

我试图找到一种使用字符串替换调用变量的好方法,以便设置其值。这是一种更好的做法,我正在寻找最佳方法。

首先,使用字典或类似结构不是我想要的。我希望设置一个变量的值!

实施例

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

所以我正在寻找一种更改变量值的智能方法,其中变量名称将表示为字符串替换。

1 个答案:

答案 0 :(得分:6)

你无法做到你想要的,而不是你设定的限制。

那是因为locals()不是活动对象。 CPython使用C数组作为局部变量,字节码使用索引来访问它们。 locals()字典是一种方便的调试工具,它将存储的本地名称列表与数组引用的值配对。试图改变该字典不会更新实际的局部变量数组。

正如您所知,exec确实有效,因为在这种情况下,Python 2会禁用本地优化,并且在将exec添加到混合中时使用较慢的技术。在Python 3中,exec()不再是一个语句而是一个函数,而这个漏洞已经关闭了。

请参阅globals() vs locals() mutabilityBehavior of exec function in Python 2 and Python 3

因此,如果您真的在寻找最佳实践,请坚持使用字典或列表。这些是本地,但您可以通过字符串键或整数索引实际处理这些值。