Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模块初始化顺序? 我是一个来自C++背景的Python新手。虽然我知道用我以前的C++知识来寻找一个匹配的概念不是Pythonic,但我认为这个问题仍然是一个普遍的问题: 在C++下,有一个众所周知的问题,叫做全局变量/静态变量初始化顺序FASCO,这是因为C++无法决定在编译单元中首先初始化哪个全局/静态变量,因此,依赖于不同编译单元中的另一个全局/静态变量的全局/静态变量的初始化时间可能早于其依赖项对应项,并且当依赖项开始使用依赖项对象提供的服务时,我们会有未定义的行为。在这里,我不想深入探讨C++如何解决这个问题。p>_Python_Initialization - Fatal编程技术网

Python模块初始化顺序? 我是一个来自C++背景的Python新手。虽然我知道用我以前的C++知识来寻找一个匹配的概念不是Pythonic,但我认为这个问题仍然是一个普遍的问题: 在C++下,有一个众所周知的问题,叫做全局变量/静态变量初始化顺序FASCO,这是因为C++无法决定在编译单元中首先初始化哪个全局/静态变量,因此,依赖于不同编译单元中的另一个全局/静态变量的全局/静态变量的初始化时间可能早于其依赖项对应项,并且当依赖项开始使用依赖项对象提供的服务时,我们会有未定义的行为。在这里,我不想深入探讨C++如何解决这个问题。p>

Python模块初始化顺序? 我是一个来自C++背景的Python新手。虽然我知道用我以前的C++知识来寻找一个匹配的概念不是Pythonic,但我认为这个问题仍然是一个普遍的问题: 在C++下,有一个众所周知的问题,叫做全局变量/静态变量初始化顺序FASCO,这是因为C++无法决定在编译单元中首先初始化哪个全局/静态变量,因此,依赖于不同编译单元中的另一个全局/静态变量的全局/静态变量的初始化时间可能早于其依赖项对应项,并且当依赖项开始使用依赖项对象提供的服务时,我们会有未定义的行为。在这里,我不想深入探讨C++如何解决这个问题。p>,python,initialization,Python,Initialization,在Python世界中,我确实看到了全局变量的使用,即使是在不同的.py文件中,我看到的一个typycal使用案例是:在一个.py文件中初始化一个全局对象,而在其他.py文件中,代码只是无所畏惧地开始使用全局对象,假设它必须在其他地方初始化,由于我上面指定的问题,C++下的C++绝对不能接受。 我不确定上述用例是否是Python中的常见做法(Pythonic),Python通常如何解决这种全局变量初始化顺序问题?Python导入自始至终执行新的Python模块。后续导入只会导致在代码> sys s

在Python世界中,我确实看到了全局变量的使用,即使是在不同的.py文件中,我看到的一个typycal使用案例是:在一个.py文件中初始化一个全局对象,而在其他.py文件中,代码只是无所畏惧地开始使用全局对象,假设它必须在其他地方初始化,由于我上面指定的问题,C++下的C++绝对不能接受。
我不确定上述用例是否是Python中的常见做法(Pythonic),Python通常如何解决这种全局变量初始化顺序问题?

Python导入自始至终执行新的Python模块。后续导入只会导致在代码> sys sys模块中现有引用的副本,即使由于导入循环仍处于导入模块的中间。在循环导入存在之前已初始化的模块属性(“全局变量”实际上在模块范围内)

main.py

import a
var1 = 'foo'
import b
var2 = 'bar'
import a
print a.var1 # works
print a.var2 # fails
a.py

import a
var1 = 'foo'
import b
var2 = 'bar'
import a
print a.var1 # works
print a.var2 # fails
b.py

import a
var1 = 'foo'
import b
var2 = 'bar'
import a
print a.var1 # works
print a.var2 # fails
<>在C++下,有一个众所周知的问题,叫做全局变量/静态变量初始化顺序FASCO,这是因为C++无法决定在编译单元中首先初始化哪个全局/静态变量,< /P> 我认为该语句突出了Python和C++之间的一个关键区别:在Python中,不存在不同的编译单元。我的意思是,在C++中(如你所知),两个不同的源文件可以完全独立地编译,因此,如果比较文件A中的一行和文件B中的一行,则没有什么可以告诉你哪一个将被放在程序中的第一位。这有点像多线程的情况:不能说线程1中的特定语句是在线程2中的特定语句之前还是之后执行。你可以说C++程序是并行编译的。 相反,在Python中,执行从一个文件的顶部开始,并按照定义良好的顺序执行文件中的每个语句,然后在导入其他文件的位置分支到其他文件。事实上,您几乎可以将
import
指令视为
#include
,这样您就可以确定程序中所有源文件中所有代码行的执行顺序。(嗯,这比它复杂一点,因为一个模块在第一次导入时才真正执行,并且由于其他原因)如果C++程序并行编译,Python程序就被串行地解释。 您的问题还涉及Python中模块的深层含义。Python模块是一个实际对象,它是单个
.py
文件中的所有内容。单个源文件中在“全局”范围内声明的所有内容实际上都是该模块对象的属性。Python中没有真正的全局作用域。(Python程序员经常说“全局”,实际上在语言中有一个<代码>全局< /Cord>关键字,但它总是指的是当前模块的顶层。”我可以看到这是一个陌生的概念,习惯于从C++背景中来。我从java中得到一些习惯,在这方面,java比python更类似于C++。(Java中也没有全局作用域)

我将提到,在Python中,使用变量而不知道它是否已初始化/定义是完全正常的。嗯,也许不正常,但至少在适当的情况下可以接受。在Python中,尝试使用未定义的变量会引发
namererror
;在C或C++中,你不会得到任意的行为,所以你可以很容易地处理这种情况。您可能会看到这种模式:

try:
    duck.quack()
except NameError:
    pass
如果
duck
不存在,则它不会执行任何操作。事实上,你通常会看到的是

try:
    duck.quack()
except AttributeError:
    pass

如果
duck
没有名为
quack
的方法,则它不会执行任何操作。(
AttributeError
是当您尝试访问对象的属性时,会遇到的一种错误,但该对象没有该名称的任何属性。)这就是Python中类型检查的过程:我们认为如果我们只需要鸭子嘎嘎叫,我们可以让它嘎嘎叫,如果它有,我们不在乎它是不是真的鸭子。(称为鸭类型;-/<)> Python全局变量初始化顺序通过“导入”语句显式执行并执行,这是有意义的,因为C++没有显式指定编译单元依赖关系的方式。谢谢你的澄清!这绝对是对我发布的问题的透彻解释,切中要害!谢谢