了解Python是如何;编撰;或;解释为;函数对象

了解Python是如何;编撰;或;解释为;函数对象,python,function,interpreter,Python,Function,Interpreter,我读过以下文章,但我仍然不确定 如果我有一个Python文件myfunctions.py,其中包含以下代码 x = 3 def f(): print x x = 2 然后,说$python myfunctions.py运行得非常好。 但是现在对上面的文件做一个小的更改。新文件的外观如下所示 x = 3 def f(): print x x = 2 f() # there is a function call now 这一次,代码给出了一个错误。现在,我

我读过以下文章,但我仍然不确定

  • 如果我有一个Python文件myfunctions.py,其中包含以下代码

    x  = 3
    def f():
        print x
        x = 2
    
    然后,说
    $python myfunctions.py
    运行得非常好。 但是现在对上面的文件做一个小的更改。新文件的外观如下所示

    x  = 3
    def f():
        print x
        x = 2
    f() # there is a function call now
    
    这一次,代码给出了一个错误。现在,我试图理解这种行为。到目前为止,这些是我的结论

    • Python为
      x=3
    • 它创建一个函数对象f,快速扫描并具有字节码,该字节码讨论f范围内的局部变量,但请注意,Python中所有语句的字节码都不太可能被构造
    • 现在,Python遇到一个函数调用,它知道这个函数调用是合法的,因为存在关于函数对象f及其局部变量的最小字节码
    • 现在,解释器负责执行字节码,但从最初的封装外形来看,它知道x是一个局部变量,并说:“为什么在分配之前要打印?”

    有人能对此发表评论吗?提前谢谢。很抱歉,如果之前已经解决过这个问题。

    当解释器读取函数时,对于遇到的每个“名称”(变量),解释器将决定该名称是本地的还是非本地的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非
    global
    语句)?e、 g:

    如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地

    现在,在您的例子中,您尝试打印一个标记为local的变量,但是您在实际到达临界赋值语句之前就这样做了。Python查找本地名称,但找不到,因此会引发
    UnboundLocalError

    Python是非常动态的,它允许你做很多疯狂的事情,这也是它如此强大的原因之一。这样做的缺点是,除非实际运行函数,否则很难检查这些错误——事实上,python已经决定在函数运行之前不检查语法以外的任何内容。这就解释了为什么在实际调用函数之前从未看到异常


    如果希望python将变量标记为全局变量,可以使用显式的
    global
    1语句:

    x = 3
    def foo():
      global x
      print x
      x = 2
    
    foo()  # prints 3
    print x  # prints 2
    

    1python3.x进一步引入了
    非局部
    关键字

    当解释器读取函数时,对于遇到的每个“名称”(变量),解释器决定该名称是局部的还是非局部的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非
    global
    语句)?e、 g:

    如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地

    现在,在您的例子中,您尝试打印一个标记为local的变量,但是您在实际到达临界赋值语句之前就这样做了。Python查找本地名称,但找不到,因此会引发
    UnboundLocalError

    Python是非常动态的,它允许你做很多疯狂的事情,这也是它如此强大的原因之一。这样做的缺点是,除非实际运行函数,否则很难检查这些错误——事实上,python已经决定在函数运行之前不检查语法以外的任何内容。这就解释了为什么在实际调用函数之前从未看到异常


    如果希望python将变量标记为全局变量,可以使用显式的
    global
    1语句:

    x = 3
    def foo():
      global x
      print x
      x = 2
    
    foo()  # prints 3
    print x  # prints 2
    

    1python3.x进一步引入了
    非局部
    关键字

    当解释器读取函数时,对于遇到的每个“名称”(变量),解释器决定该名称是局部的还是非局部的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非
    global
    语句)?e、 g:

    如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地

    现在,在您的例子中,您尝试打印一个标记为local的变量,但是您在实际到达临界赋值语句之前就这样做了。Python查找本地名称,但找不到,因此会引发
    UnboundLocalError

    Python是非常动态的,它允许你做很多疯狂的事情,这也是它如此强大的原因之一。这样做的缺点是,除非实际运行函数,否则很难检查这些错误——事实上,python已经决定在函数运行之前不检查语法以外的任何内容。这就解释了为什么在实际调用函数之前从未看到异常


    如果希望python将变量标记为全局变量,可以使用显式的
    global
    1语句:

    x = 3
    def foo():
      global x
      print x
      x = 2
    
    foo()  # prints 3
    print x  # prints 2
    

    1python3.x进一步引入了
    非局部
    关键字

    当解释器读取函数时,对于遇到的每个“名称”(变量),解释器决定该名称是局部的还是非局部的。使用的标准非常简单。。。正文中是否有该名称的赋值语句(除非
    global
    语句)?e、 g:

    如果该名称有赋值语句,则该名称被标记为“本地”,否则将被标记为非本地

    现在,在您的例子中,您尝试打印一个标记为local的变量,但在您实际使用r之前就这样做了