擅长:python、mysql、java
<p>发生的情况是,<code>passIf</code>参数lambda引用了封闭范围内的<em>变量</em><code>client</code>。它不是指变量<code>client</code>创建时所指的对象,而是变量本身。如果在循环结束后调用这些<code>passIf</code>,这意味着它们都引用循环中的最后一个值。(在闭包术语中,Python的闭包是<em>后期绑定</em>,而不是<em>早期绑定</em>)</p>
<p>幸运的是,将后期绑定闭包转换为早期绑定闭包相当容易。您只需为lambda提供一个参数,并将要绑定的值作为默认值:</p>
<pre><code>passIf = lambda client=client: client.returncode(CMD2) == 0
</code></pre>
<p>这意味着函数得到了额外的参数,如果意外地用一个参数调用它,或者当你希望函数接受任意参数时,它可能会把事情搞砸。所以另一种方法是这样做:</p>
^{pr2}$