擅长:python、mysql、java
<p>以上两个答案都是正确的,说明技术上,变异<code>kwargs</code>永远不会对父作用域产生影响。</p>
<p>但是。。。<strong>这不是故事的结尾。在函数作用域之外共享到<code>kwargs</code>的<em>引用</em>是可能的,然后您会遇到所有常见的共享变异状态问题。</p>
<pre><code>def create_classes(**kwargs):
class Class1:
def __init__(self):
self.options = kwargs
class Class2:
def __init__(self):
self.options = kwargs
return (Class1, Class2)
Class1, Class2 = create_classes(a=1, b=2)
a = Class1()
b = Class2()
a.options['c'] = 3
print(b.options)
# {'a': 1, 'b': 2, 'c': 3}
# other class's options are mutated because we forgot to copy kwargs
</code></pre>
<p>从技术上讲,这回答了您的问题,因为共享对<code>mutable</code>kwargs的引用确实会导致超出函数作用域的效果</p>
<p>在生产代码中,我已经多次被这个问题困扰,现在,无论是在我自己的代码中,还是在审查其他代码时,我都明确地注意到了这个问题。这个错误在我上面设计的例子中很明显,但是在创建共享一些公共选项的工厂函数时,它在实际代码中更隐蔽。</p>