定义其他函数内部的函数

时间:2016-10-25 05:34:56

标签: python scope

我在程序(Python)中的函数内部定义了一个函数:

def func1:
   x = 5
   def func2(y):
      return x*y

x = 4
print func2(5)

这里x的范围是如何工作的,没有重新定义x = 4的行的AND? 这是针对特定语言的行为吗?

1 个答案:

答案 0 :(得分:0)

首先:你太懒了。在此处编写代码之前,至少要将其提供给解释器或编译器以获取相关语言,以清除明显的问题。在这种情况下,有两个:

  1. 由于语法错误,您的示例代码无法编译。通过在()
  2. 的定义上添加func1来修复此问题
  3. 您的示例代码由于func2在其调用位置未定义而无法运行。
  4. 所以,试试吧

    #!/usr/bin/env python
    
    def func1():
       x = 5 
       def func2(y):
          #x = x + 1  # invalid: "x referenced before assignment"
          return x*y  # not invalid! reference to x is fine
       global func3
       func3 = func2
    
    #print func3(5)  # undefined
    
    func1()
    
    print func3(5)
    #print func2(5)  # undefined
    

    评论三行;它们在取消注释时会产生错误。

    正如您所看到的,默认情况下,变量和函数的Python定义都是 local :在函数中定义时,它们仅适用于该函数,不能在其他地方使用。

    函数外部定义的变量可以在函数内部使用。 但是,它们只能读取,而不能写入。这解释了为什么我们可以在x内使用func2但无法分配给它;取消注释x = x + 1时,会将其解释为应用于x内的其他func2变量,这就是为什么我们会收到错误,抱怨它未经初始化使用。

    此外,Python还有 global 变量,可以在程序中的任何地方使用 ;此类变量必须明确标记为global

    这非常类似于PHP(其中变量也可以标记为global)并且与许多其他语言非常相似,例如C(没有global,但是类似{{ 1}})。

    您尝试让函数(extern)使用在其定义的上下文中定义的变量(func2),然后在{{1}的上下文之外调用该函数已定义并仍然有效。可以执行此操作的函数称为闭包

    我们刚看到Python only has partial support for closures:该函数可以读取这些变量,但不能修改它们。这已经比许多其他语言更好了。但是,完全关闭也可以修改这些变量。

    例如,以下是有效的Perl代码:

    x

    完全关闭支持传统上与dynamic scoping相关联(即,在运行时评估可执行语句的定义)。这是因为它是由Lisp引入的,它是动态范围的,并且在使用static (lexical) scoping的语言中很少支持它(其中定义的范围是在编译时确定的,而不是在运行时确定的)。但是这个Perl代码中的所有变量和函数定义都是静态范围的。