【问题标题】:Change the value of a local variable where variable name will be expressed as a string更改局部变量的值,其中变量名将表示为字符串
【发布时间】:2015-09-07 13:39:14
【问题描述】:

我正在尝试找到一种使用字符串替换来调用变量以设置其值的良好且安全的方法。这是一个更最佳的做法,我正在寻找最好的方法来做到这一点。

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

示例;

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

我正在寻找一种实用的方法来实现这一点。经过测试但不起作用的事情是:

我不想将我的变量保留在 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

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

【问题讨论】:

  • 你不能通过locals()改变本地人;它只是一个反射,而不是一个活的物体。
  • 你说你不想用字典,但为什么不用列表呢?
  • 而字典也是一个本地对象。只是一个您可以通过字符串处理值的方法。您对必须使用当地人而不使用exec 的限制让您画在一个人造角落。你不能在你设定的限制内做你想做的事。
  • 换句话说:smart 方法是不使用本地人。使用字典。
  • @FallenAngel:这是不可能的。

标签: python python-2.7


【解决方案1】:

你不能做你想做的事,不在你设定的限制范围内。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2015-03-17
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多