栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python模块初始化顺序?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python模块初始化顺序?

在C 中,存在一个众所周知的问题,称为全局/静态变量初始化顺序失败,原因是C 无法确定哪个全局/静态变量将首先在编译单元中初始化,

我认为该声明突出了Python和C 之间的关键区别:在Python中,没有诸如不同的编译单元之类的东西。我的意思是,在C

(如您所知)中,两个不同的源文件可能完全彼此独立地进行编译,因此,如果您比较文件A中的一行和文件B中的一行,就没什么好说的了您将被放置在程序的第一位。这有点像具有多个线程的情况:您无法说出线程1中的特定语句是在线程2中的特定语句之前还是之后执行。您可以说C
++程序是并行编译的。

相反,在Python中,执行从一个文件的顶部开始,并以明确定义的顺序在文件中的每个语句中进行,然后在导入它们的位置分支到其他文件。实际上,您几乎可以将

import
指令视为
#include
,并可以通过这种方式确定程序中所有源文件中所有代码行的执行顺序。(好吧,这要复杂得多,因为模块只有在第一次导入时才真正执行,并且由于其他原因。)如果C
++程序是并行编译的,则Python程序将被串行解释。

您的问题还涉及Python中模块的更深层含义。Python模块-包含在单个

.py
文件中的所有内容-
是实际对象。单个源文件中在“全局”范围内声明的所有内容实际上都是该模块对象的属性。Python中没有真正的全局范围。(Python程序员经常说“全局”,实际上
global
在该语言中有一个关键字,但它实际上始终是指当前模块的顶层。)我可以看到,要习惯于使用一个奇怪的概念从C
背景开始。来自Java的使我适应了一些习惯,在这方面,Java与Python相比,与C 更加相似。(Java中也没有全局范围)

我将提到在Python中使用变量是完全正常的,而不知道是否已初始化/定义变量。好吧,也许不正常,但在适当情况下至少可以接受。在Python中,尝试使用未定义的变量会引发

NameError
;
您不会像在C或C ++中那样获得任意行为,因此您可以轻松地处理这种情况。您可能会看到以下模式:

try:    duck.quack()except NameError:    pass

如果

duck
不存在,则不执行任何操作。其实,您通常会看到的是

try:    duck.quack()except AttributeError:    pass

如果

duck
没有名为的方法,则不执行任何操作
quack
。(这
AttributeError
是您尝试访问对象的属性时遇到的错误,但是该对象没有该名称的任何属性。)这就是通过Python中的类型检查所通过的:我们认为如果需要的话鸭子要做的是嘎嘎,我们可以要求鸭子嘎嘎,如果是,我们不在乎它是否
真的 是鸭子。(这被称为鸭子打字;-)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639747.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号