【问题标题】:How to get the value of a variable given its name in a string? [duplicate]如何在字符串中获取给定名称的变量的值? [复制]
【发布时间】:2012-03-15 07:33:30
【问题描述】:

为简单起见,这是我想做的精简版:

def foo(a):
    # I want to print the value of the variable
    # the name of which is contained in a

我知道如何在 PHP 中做到这一点:

function foo($a) {
    echo $$a;
}

global $string = "blah"; // might not need to be global but that's irrelevant
foo("string"); // prints "blah"

有什么办法吗?

【问题讨论】:

    标签: python string variables


    【解决方案1】:

    Edward Loper 的答案仅在变量位于当前模块中时才有效。要获取另一个模块中的值,可以使用getattr

    import other
    print getattr(other, "name_of_variable")
    

    https://docs.python.org/3/library/functions.html#getattr

    【讨论】:

    • 如果你想使用这个方法在你调用getattr()的同一个模块中获取一个值,使用import sys; sys.modules[__name__]来获取对当前模块的引用。
    • 你有python3的替代品吗?
    • @GuillermoMosse 不,应该是一样的:docs.python.org/3.8/library/functions.html#getattr
    【解决方案2】:

    假设您知道该字符串可以安全评估,那么 eval 将给出当前上下文中变量的值。

    >>> string = "blah"
    >>> string
    'blah'
    >>> x = "string"
    >>> eval(x)
    'blah'
    

    【讨论】:

      【解决方案3】:

      如果它是一个全局变量,那么你可以这样做:

      >>> a = 5
      >>> globals()['a']
      5
      

      关于各种“eval”解决方案的说明:您应该小心使用 eval,特别是如果您正在评估的字符串来自可能不受信任的来源 - 否则,您最终可能会删除磁盘的全部内容或如果给你一个恶意字符串,就会出现类似的情况。

      (如果它不是全局的,那么您将需要访问它定义的任何命名空间。如果您没有它,那么您将无法访问它。)

      【讨论】:

      • locals() 本地人。
      【解决方案4】:
      >>> x=5
      >>> print eval('x')
      5
      

      多多!

      【讨论】:

      • 安全漏洞:“tada!”。
      • @Sapphire_Brick 公平地说,只要正在评估的 str 是一个常数,它不应该是一个大问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多