<p>重要的是要了解在任何给定的时间,你用一个给定的名字所指的值是什么。我的意思是:</p>
<pre><code>def doFoo1(testdict):
testdict["A"] = "test1" # this changes a value contained in testdict
print(id(testdict)) # the id
def doFoo2(testdict):
testdict = {some:"new dict"} # this creates a new dict object
print(id(testdict)) # prints a different id, since testdict is a new object
def foo():
mydict = {'A': '1235', 'B': '6458', 'C': 54156}
print(id(mydict))
doFoo1(mydict)
print(id(mydict))
doFoo2(mydict)
print(id(mydict))
</code></pre>
<p>以下是我的系统上的输出(Windows 7上的64位Python 3.3):</p>
<pre><code>>>> foo()
59383560
59383560
59383560
59413832
59383560
</code></pre>
<p>打印了五个<code>id</code>值,其中三个(第一个、第三个和第五个)来自<code>foo</code>,另一个来自每个<code>doFoo</code>函数(第二个和第四个)。doFoo2中的一个是唯一一个与其他不相同的,因为语句<code>testdict = {some:"new dict"}</code>创建了一个新对象,该对象绑定到该函数命名空间中的<code>testdict</code>名称。这种变化不会反映在<code>foo</code>函数中,因为它的<code>mydict</code>名称仍然绑定到原始对象。你知道吗</p>
<p>这是Python的一部分,与大多数其他编程语言不同。与C不同,C中的变量名对应于内存中的特定位置,而在Python中,名称是指特定对象。如果您再次指定名称,则只需将名称重新绑定到另一个对象(完全不影响原始对象,但如果没有其他引用,则可能会对其进行垃圾收集)。你知道吗</p>
<p>这个<a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables" rel="nofollow">Code like a Pythonista</a>演示的一部分对理解这种区别非常有帮助。我认为“nametag”这个比喻非常有助于理解Python中名称绑定的工作原理。你知道吗</p>