【问题标题】:Python function calling orderPython函数调用顺序
【发布时间】:2017-12-14 22:52:13
【问题描述】:

当您运行程序时,Python 如何“读入”程序?例如,我不明白为什么下面的代码中没有NameError: name 'cough' is not defined

def main():
    for i in range(3):
        cough()


def cough():
    print('cough')


if __name__ == '__main__':
    main()

基本上,我的问题也可以说是为什么上面和下面的程序输出相同的东西:

def cough():
    print('cough')


def main():
    for i in range(3):
        cough()


if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python call interpreter


    【解决方案1】:

    Python 从脚本的顶部读取到底部。在这两个示例中,cough() 函数在定义后被调用。

    当您在内部定义 main()cough() 时,cough() 函数实际上并没有运行。它直到最后一行才运行 - 即在它们已经定义之后。

    【讨论】:

      【解决方案2】:

      Python 是一种解释型语言,它逐句执行 (感谢 viraptor 的提示:编译为字节码时,它发生在整个文件 + 每个函数上)

      在这种情况下,程序逐行读取并知道函数cough()main() 已定义。后来当main() 被调用时,Python 知道它是什么,当main() 调用cough() 时,Python 也知道它是什么。

      def cough():
          print('cough')
      
      
      def main():
          for i in range(3):
              cough()
      
      
      if __name__ == '__main__':
          main()
      

      在另一种情况下(如下)是同样的事情。只是Python在cough()之前知道main()函数是什么。在这里你可能想知道:“为什么python不知道caugh()main()里面是什么?”好问题,我的朋友。

      但只要在调用函数之前定义了函数,一切都很好。因为记住 在你调用它之前,Python 不会“检查”是否定义了一个函数。 所以在这种情况下,即使在 python 读取函数 main() 时,cough() 也没有定义,这没关系,因为直到下面定义了cough(),我们才调用main()

      def main():
          for i in range(3):
              cough()
      
      
      def cough():
          print('cough')
      
      
      if __name__ == '__main__':
          main()
      

      希望这能帮助您更好地理解 Python。

      【讨论】:

      • “逐行编译” - “逐语句执行”怎么样?这是一个更正确的描述。 (因为它不是基于行的,当编译为字节码时,它发生在整个文件+每个函数上)
      【解决方案3】:

      防止错误发生的代码如下:

      if __name__ == '__main__':
          main()
      

      因为你是把它放在代码的最后,所以在python读完上面的所有代码之后。 如果您尝试编写类似

      的内容
      def main():
          for i in range(3):
              cough()
      
      if __name__ == '__main__':
          main()
      
      def cough():
          print('cough')
      

      你将得到的只是这个:

      NameError: name 'cough' is not defined
      

      【讨论】:

        【解决方案4】:

        当 Python 在执行源代码时遇到函数时,它不会立即运行该函数。相反,它将函数编译为可执行代码对象,并等待您实际调用该函数。

        这意味着 Python 检查 cough() 是否真正定义的唯一时间是在您调用 main() 时。由于 Python 在调用 main 时确实找到了 cough 函数,因此它不会引发错误。

        换句话说:Python 直到运行时才验证函数中使用的名称是否实际存在,因此您允许使用当前未定义的变量名称

        这与这样的函数在定义时不会引发错误但在运行时会引发错误的原因相同:

        >>> def func():
            a + b
        
        >>> func # func was compiled...
        <function func at 0x7f8ddd5d6488>
        >>> func() # but we cannot call it.
        Traceback (most recent call last):
          File "<pyshell#9>", line 1, in <module>
            func() # but we cannot call it.
          File "<pyshell#7>", line 2, in func
            a + b
        NameError: name 'a' is not defined
        >>> 
        

        另外请注意,如果您在定义咳嗽之前尝试调用main,您收到错误:

        >>> def main():
            for i in range(3):
                cough()
        
        
        >>> main()
        Traceback (most recent call last):
          File "<pyshell#13>", line 1, in <module>
            main()
          File "<pyshell#12>", line 3, in main
            cough()
        NameError: name 'cough' is not defined
        >>> 
        

        这表明 Python 依赖于函数中的每个名称,无论是全局还是本地,在您尝试使用它们之前都已定义它们。

        【讨论】:

          【解决方案5】:

          那是因为真正的执行代码在这里

          如果 name == 'ma​​in': 主要()

          当main()被调用时,main和cough都被定义了

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-07
            • 1970-01-01
            • 2016-05-22
            • 2017-05-12
            • 2014-01-28
            • 2018-05-08
            相关资源
            最近更新 更多