Python 变量的赋值和加载
Python Assignment and Loading of Vars
我对变量赋值与变量加载有一个普遍的疑问。加载脚本后是否会立即对所有变量(脚本的作用域是全局变量)发生这种情况,还是仅在引用它们时发生。我将用一个例子来解释我的想法:
假设我们有一个 config.py
,其中只有配置变量作为内容:
config.py:
VAR1 = "VALUE1"
VAR2 = "VALUE2"
VAR3 = "VALUE3"
.
.
VARn = "VALUEn"
从技术上讲,这是一个独立的脚本。但是,在我的用例中,我的项目结构为:
project-root
|--file1.py
|--file2.py
|--main.py
|--config.py
|--subdir
|-f1
|-f2
现在,所有配置常量都在 config.py
中定义,并且在项目中的所有其他 python 脚本中导入和使用。
我的问题是,一旦我 运行 我的项目通过 main.py
,什么时候会分配 config.py
中定义的所有变量?我能想到的可能答案:
- 当第一次遇到
import config
时,所有赋值都会发生
- 当访问配置中的第一个变量时,所有赋值都会发生
- 每当第一次从
config.py
访问任何配置常量时,就只会分配那个配置常量。其他人不会。 (延迟分配,每次访问)
以下哪个是正确的?
首次导入模块时,Python 搜索该模块,如果找到,它会创建一个模块对象并通过 运行 中的代码对其进行初始化。所有执行的 top-level 变量、函数和 class 定义都将保存为模块对象的内容。这包括在执行模块的顶层期间在定义之后发生的对后两者的调用或创建的实例。 (这还包括在导入模块后对 third-party 模块进行的任何“获取值”调用。)
这只会发生一次,因为创建的所有模块对象都存储在名为 sys.modules
的字典中,该字典将模块名称映射到已加载的模块。使用字典中的模块对象将满足导入同名模块的其他尝试。它实际上是一个临时存储 space 以允许快速访问它们 — 即它是一个 缓存 。因此,模块通常只执行一次,即使它们可能在主脚本(或其他 运行 作为 side-effect 的脚本执行期间被多次 import
ed它的执行)。
此 section of the documentation. Of course it also contains information specifically about the import statement 中描述了一般的导入系统。
我对变量赋值与变量加载有一个普遍的疑问。加载脚本后是否会立即对所有变量(脚本的作用域是全局变量)发生这种情况,还是仅在引用它们时发生。我将用一个例子来解释我的想法:
假设我们有一个 config.py
,其中只有配置变量作为内容:
config.py:
VAR1 = "VALUE1"
VAR2 = "VALUE2"
VAR3 = "VALUE3"
.
.
VARn = "VALUEn"
从技术上讲,这是一个独立的脚本。但是,在我的用例中,我的项目结构为:
project-root
|--file1.py
|--file2.py
|--main.py
|--config.py
|--subdir
|-f1
|-f2
现在,所有配置常量都在 config.py
中定义,并且在项目中的所有其他 python 脚本中导入和使用。
我的问题是,一旦我 运行 我的项目通过 main.py
,什么时候会分配 config.py
中定义的所有变量?我能想到的可能答案:
- 当第一次遇到
import config
时,所有赋值都会发生 - 当访问配置中的第一个变量时,所有赋值都会发生
- 每当第一次从
config.py
访问任何配置常量时,就只会分配那个配置常量。其他人不会。 (延迟分配,每次访问)
以下哪个是正确的?
首次导入模块时,Python 搜索该模块,如果找到,它会创建一个模块对象并通过 运行 中的代码对其进行初始化。所有执行的 top-level 变量、函数和 class 定义都将保存为模块对象的内容。这包括在执行模块的顶层期间在定义之后发生的对后两者的调用或创建的实例。 (这还包括在导入模块后对 third-party 模块进行的任何“获取值”调用。)
这只会发生一次,因为创建的所有模块对象都存储在名为 sys.modules
的字典中,该字典将模块名称映射到已加载的模块。使用字典中的模块对象将满足导入同名模块的其他尝试。它实际上是一个临时存储 space 以允许快速访问它们 — 即它是一个 缓存 。因此,模块通常只执行一次,即使它们可能在主脚本(或其他 运行 作为 side-effect 的脚本执行期间被多次 import
ed它的执行)。
此 section of the documentation. Of course it also contains information specifically about the import statement 中描述了一般的导入系统。