代码之家  ›  专栏  ›  技术社区  ›  jxie0755

检查了非本地语句,但没有在python中运行函数[duplicate]

  •  4
  • jxie0755  · 技术社区  · 7 年前

    这个问题已经有了答案:

    以前我认为当我们定义一个函数时,函数可能是错误的,但是在执行之前,python不会检查它:

    x = 100
    
    def f():
        x = 1/0
        return x
    
    print(x)
    # >>> 100
    

    然而,当我学习 nonlocal 陈述

    x = 100
    
    def f():
        def g():
            nonlocal x
            x = x * 99
            return x
        return g
    
    print(x)
    # >>> SyntaxError: no binding for nonlocal 'x' found
    

    它被签出,即使函数没有执行。

    有没有什么官方解释?

    变量边界情况的附加:

    x = 100
    def f():
        global x
        global xx
        x = 99
        return x
    
    print(f())
    # >>> 99
    print(x)
    # >>> 99
    

    如果我 global 一些根本不存在的变量? 即使我执行这个函数,它也不会带来任何错误?

    这部分将转到一个新的个人问题: Why am I able to global a non-existing varlable in python

    1 回复  |  直到 7 年前
        1
  •  3
  •   blue_note    7 年前

    这个 nonlocal 检查 最近的封闭范围 , 不包括全局 (即模块级变量)。也就是说,你的 f() 函数应声明 x 使之起作用,如 非本地 看不到全球 x = 100 变量。

    https://docs.python.org/3/reference/simple_stmts.html#the-global-statement .

    至于在不运行函数的情况下引发错误的原因,是因为变量名绑定在 编译时间 ,所以根本不使用这个函数也没关系。见 https://docs.python.org/3/reference/executionmodel.html#resolution-of-names

    然而, global 有不同的行为。就像 非本地 如果 global x 已经存在,它被使用而不是本地的。但是,如果没有,则表示“如果我创建一个名为 X ,在全局范围内创建它,而不是在函数范围内创建它”。所以,在你的例子中

    x = 100
    def f():
        global x
        global xx
        x = 99
        xx = 123
        return x
    
    print(f()) # 99
    print(x)   # 99
    print(xx)  # 123
    

    xx 变量已出现在全局命名空间中。它只是一个 暗示 但是,如果您声明 global xx 不分配,并尝试 print(xx) 以后,你还是会得到一个 NameError 用于使用未定义的变量