【问题标题】:How do I check if a variable exists, inside a Function?如何检查函数内部是否存在变量?
【发布时间】:2020-04-01 02:22:13
【问题描述】:

我正在尝试检查变量是否存在,但在函数内部。 我被告知,要做到这一点,你唯一需要做的就是:

'a' in locals() 

不幸的是,事情比我预期的要困难一些。

我试图定义一个包含这个方法的函数。

q=[1,2,3]
def f():
    print('q' in locals())

当我运行这个函数时,它返回:

False

问题是,正如我们所见,q 是一个变量,所以当我运行相同的命令,但在函数之外:

'q' in locals()

返回:

True

有没有办法解决这个问题?

【问题讨论】:

  • def f(): print('q' in globals()) 应该打印True
  • 你需要检查变量名作为一个字符串吗?您可以尝试/排除变量并捕获 NameError 吗?
  • 根据docs.python.org/3.8/library/functions.html#locals,“请注意,在模块级别,locals() 和 globals() 是同一个字典。”这就解释了为什么当你在函数外运行时locals()True

标签: python function variables


【解决方案1】:

您可以在globals() 字典中测试您的列表q 的存在,因为它存在于全局范围内,而不是您的函数f 的本地范围内,即:

def f():
    print('q' in globals())

正如 cmets 中所指出的,像这样使用字符串名称测试变量的存在并不理想,您可以改用 try/except:

def f():
    try:
        # Do something with q
        print(q)
    except NameError:
        print("Variable not defined")

【讨论】:

    【解决方案2】:

    当您编写以下代码行时

    q=[1,2,3]
    def f():
        print('q' in locals())
    f()
    

    这里,变量 'q' 不是函数 f() 的局部变量,因为它是在函数范围之外声明的。在函数内部,可以使用全局访问 q。 但是,函数“q”之外是一个局部变量。 因此,当您检查函数内部时

    q=[1,2,3]
    def f():
        print('q' in locals())
    

    它会返回 False

    但是如果你在函数内部声明并检查如下:-

    def f():
        q=[1,2,3]
        print('q' in locals())
    

    它将返回 True,因为 q 现在是函数的本地变量。

    此外,如果您将函数内部的“q”检查为全局,它将返回 True,因为“q”在函数外部声明并具有全局范围。

    q=[1,2,3]
    def f():
        print('q' in globals())
    f()
    

    输出

    True
    

    【讨论】:

    • 如果 print('q' in globals()) 返回 False 那么变量不是本地变量,但如果它返回 True 那么变量是函数的局部变量
    【解决方案3】:

    你可以使用

    hasattr(obj, "var")

    用self替换obj

    class test():
        def  __init__(self):
            self.a = 1
        def check(self, var):
            return hasattr(self, var)
    
    t = test()
    
    print(t.check("a"))
    print(t.check("b"))
    

    输出

    True
    False
    

    【讨论】:

    • OP 没有使用类。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多