擅长:python、mysql、java
<p>在Python中,每个模块都有自己独立的全局变量。这实际上是模块的全部要点(与C预处理器样式的文本插入相反)。</p>
<p>当您执行<code>from .child import *</code>操作时,它将导入<code>.child</code>,然后将其所有全局变量复制到当前模块的全局变量中。它们仍然是独立的模块,有自己的全局变量。</p>
<hr/>
<p>如果要在不同模块中的代码之间传递值,则可能需要将该代码包装在函数中,然后将这些值作为函数参数和返回值传递。例如:</p>
<p><code>parent/__init__.py</code>:</p>
<pre><code>from .child import *
favorite_numbers = [1]
def my_favorite_numbers():
for num in favorite_numbers:
num
my_favorite_numbers()
child_stuff(favorite_numbers)
my_favorite_numbers()
</code></pre>
<p><code>parent/child.py</code>:</p>
^{pr2}$
<hr/>
<p>实际上,除了初始化(定义函数和类、创建常量和其他单例函数等)之外,您几乎总是希望在函数中包装任何代码。当您<code>import</code>一个模块(包括<code>from … import</code>)时,它只在第一次运行其顶层代码。如果您再次<code>import</code>,那么模块对象已经存在于内存中(在<code>sys.modules</code>中),因此Python将只使用该对象,而不是再次运行代码来构建它。</p>
<hr/>
<p>如果您真的想将一个值推送到另一个模块的命名空间中,可以,但必须显式地执行。这意味着您必须通过导入模块对象,而不仅仅是从</em>导入模块对象:</p>
<pre><code>from . import child
child.favorite_numbers = favorite_numbers
</code></pre>
<p>但这绝不是个好主意。</p>