<p>为了回应你更新的代码。。。错误消息<em>仍然</em>正确,因为尽管您已经在模块级别定义了<code>stelnet</code>,但是定义它太晚了。它的定义发生在<code>calculateWinner</code>函数中的</em>之后。在</p>
<p>将代码分解为一个可笑的最小示例,您正在执行以下操作:</p>
<pre class="lang-python2 prettyprint-override"><code>def calculateWinner():
# A leap of faith... There is no `stelnet` defined
# in this function.
stelnet.send(results[0])
def reinitScore():
# Indirectly depends on `stelnet` too.
calculateWinner()
# But we haven't defined `stelnet` yet...
reinitScore() # Kaboom!
# These lines will never run, because the NameError has
# already happened.
if __name__ == '__main__':
stelnet = ... # Too late.
</code></pre>
<p><code>calculateWinner</code>依赖于函数编译时不存在的名称。它是正常工作还是崩溃取决于是否有其他代码定义了<code>stelnet</code>1),其中<code>calculateWinner</code>可以在其中得到,2)在<code>calculateWinner</code>执行之前。在</p>
<p><strong>建议</strong></p>
<p>依赖于全局可变状态的函数很难理解,更不用说正确的代码了。很难判断什么依赖于哪些变量,或者是什么在修改它们,或者什么时候。另外,提出一个<a href="https://stackoverflow.com/help/mcve">MCVE</a>比它应该更麻烦,因为看起来独立的函数可能不是。在</p>
<p>将尽可能多的模块级代码填充到一个<code>main</code>函数中,并从<code>if __name__ == '__main__':</code>的主体调用它(而不是其他任何东西)(因为即使是<em>,那个</em>实际上也在模块级)。在</p>
<p>考虑如下:</p>
^{pr2}$
<p>这些函数仍然由它们传递的共享字典连接,但是只有显式传递给字典的函数才能更改其内容。在</p>