<p>您可以不使用<code>global</code>关键字修改任何可变对象。</p>
<p>这在Python中是可能的,因为<code>global</code>用于将新对象重新分配给已在全局范围中使用的变量名或定义新的全局变量。</p>
<p>但是对于可变对象,您不需要分配任何东西,只需在适当的位置修改它们,因此Python只需从全局范围加载它们并修改它们。</p>
<p>正如<a href="http://docs.python.org/2/reference/simple_stmts.html#grammar-token-global_stmt" rel="nofollow noreferrer">docs</a>所说:</p>
<blockquote>
<p>It would be impossible to assign to a global variable without global.</p>
</blockquote>
<pre><code>In [101]: dic = {}
In [102]: lis = []
In [103]: def func():
dic['a'] = 'foo'
lis.append('foo') # but fails for lis += ['something']
.....:
In [104]: func()
In [105]: dic, lis
Out[105]: ({'a': 'foo'}, ['foo'])
</code></pre>
<p><code>dis.dis</code>:</p>
<pre><code>In [121]: dis.dis(func)
2 0 LOAD_CONST 1 ('foo')
3 LOAD_GLOBAL 0 (dic) # the global object dic is loaded
6 LOAD_CONST 2 ('a')
9 STORE_SUBSCR # modify the same object
3 10 LOAD_GLOBAL 1 (lis) # the global object lis is loaded
13 LOAD_ATTR 2 (append)
16 LOAD_CONST 1 ('foo')
19 CALL_FUNCTION 1
22 POP_TOP
23 LOAD_CONST 0 (None)
26 RETURN_VALUE
</code></pre>