繁体   English   中英

Python中的任意范围嵌套

[英]Arbitrary scope nesting in Python

以下python示例来自此处

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()

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

L :局部变量

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

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

B :内置变量

程序如何执行:

  1. f1被定义,然后f1被称为
  2. 调用f1x取值为99 ,然后定义f2 ,然后调用f2
  3. 调用f2 ,先定义f3 ,然后再调用f3
  4. 调用f3 ,将打印x ,并且由于f3没有局部x ,因此它将使用f1局部的enclosing x。 然后,使用print功能精确打印字符串"f3"
  5. 最后, f3返回, f2返回, f1返回,程序完成。

考虑一下代码:

def f():
    print(123)

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

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

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

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')

然后执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM