擅长:python、mysql、java
<p>tldr:不要使用<code>from module import *</code></p>
<p><code>import *</code>没有你想象的那么特别——当你用<code>from mergSort import *</code>导入东西时,把它想象成</p>
<pre><code>import mergSort
mainCounter = mergSort.mainCounter
merg = mergSort.merg
del mergSort
</code></pre>
<p>所以您实际上只有一个对int对象的引用,<code>mergSort.mainCounter</code>在导入时引用了它。<code>mergSort</code>使用<code>mergSort.mainCounter</code>一;方法与</p>
^{pr2}$
<p>我们有两个对整数对象的独立引用,递增一个(将引用更改为指向由对旧对象的方法调用生成的新对象)不会影响另一个。要确认这一点,请尝试</p>
<pre><code>merg.__globals__['mainCounter']
</code></pre>
<p>或者</p>
<pre><code>import sys; sys.modules[merg.__module__].mainCounter
</code></pre>
<p>这些应该具有merg正在使用的主计数器值。在</p>
<p>(<code>sys.modules['mergSort'] is merg.__globals__</code>是真的,它们是同一个东西字典)</p>
<p>当一个名称在函数中被声明为全局时,它将在函数的模块名称空间中查找。在</p>
<p><code>import *</code>经常被人诟病,因为它使跟踪名称的来源变得非常困难,但在这里它也很糟糕,因为它打破了我们对模块的概念-仅仅因为从模块导入*并不意味着您实际上在它的名称空间中,您刚刚完成了<code>from module import a, b, c, d, e, ...</code>。这种情况更糟,因为许多名称在Python中没有太多的重新绑定,但是有些名称总是绑定的,就像名称通过引用整数充当计数器一样。在</p>