Python中的任意范围嵌套

时间:2018-08-07 05:51:39

标签: python syntax scope

以下python示例来自here

def f1():
  x = 99
  def f2():
      def f3():
          print(x)
          print('f3')
      f3()
  f2()
f1()

这是输出:

99
f3

为什么输出不以下?

99
f3   # from f1()
99
f3   # from f3()
99
f3   # from f2()

3 个答案:

答案 0 :(得分:2)

您应该考虑Python作用域规则(LEGB)。 PYthon将寻找:

L:局部变量

E:封闭变量(封闭函数中定义的变量)

G:全局变量(零缩进级别的变量)

B:内置变量

程序的执行方式:

    定义
  1. f1,然后调用f1
  2. 调用f1时,x取值为99,然后定义f2,然后调用f2
  3. 调用f2时,先定义f3,然后再调用f3
  4. 调用f3时,将打印x,并且由于x中没有本地f3,因此它将使用本地的enclosing x到f1。然后,您将使用"f3"函数精确地打印字符串print
  5. 最后,f3返回,f2返回,f1返回,程序结束。

答案 1 :(得分:2)

考虑代码:

def f():
    print(123)

在执行时不会打印任何内容。 def仅定义函数-在执行f()之前不会执行。

类似地,您的示例仅定义内部函数,但是只有在调用f3时,print语句才会执行。

答案 2 :(得分:2)

这是因为解开代码后,它简化为:

x = 99
print(x)
print('f3')

这是展开的顺序:

def f1():
  x = 99
  def f2():
      def f3():
          print(x)
          print('f3')
      f3()
  f2()
f1()

成为

  x = 99
  def f2():
      def f3():
          print(x)
          print('f3')
      f3()
  f2()

成为

  x = 99
  def f3():
      print(x)
      print('f3')
  f3()

成为

  x = 99
  print(x)
  print('f3')

然后执行。