Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查函数中是否存在变量?_Python_Function_Variables - Fatal编程技术网

Python 如何检查函数中是否存在变量?

Python 如何检查函数中是否存在变量?,python,function,variables,Python,Function,Variables,我试着检查变量是否存在,但在函数内部。 我被教导,要做到这一点,你唯一需要做的就是: 'a' in locals() 不幸的是,事情比我想象的要困难一点 我试图定义一个包含此方法的函数 q=[1,2,3] def f(): print('q' in locals()) 当我运行此函数时,它返回: False True 问题是,正如我们所看到的,q是一个变量,所以当我运行相同的命令,但在函数之外时: 'q' in locals() 它返回: False True 有办法解决

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

'a' in locals() 
不幸的是,事情比我想象的要困难一点

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

q=[1,2,3]
def f():
    print('q' in locals())
当我运行此函数时,它返回:

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

'q' in locals()
它返回:

False
True
有办法解决这个问题吗?

您可以使用

hasattrobj,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

当您编写以下代码行时

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

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

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

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

def f:globals中的print'q'应为True。是否需要将变量名检查为sting?您是否可以尝试/删除该变量并捕获NameError?根据,请注意,在模块级别,局部变量和全局变量是同一个字典。这解释了为什么在函数外部运行时,局部变量为True。OP没有使用类。如果globals中的print'q'返回False,则变量不是局部变量,但如果它返回True,则变量是函数的局部变量