在任何给定时间,了解您使用给定名称所指的值非常重要。这就是我的意思:
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))
这是我系统上的输出(Windows 7 上的 64 位 Python 3.3):
>>> foo()
59383560
59383560
59383560
59413832
59383560
打印了五个id
值,三个(第一个、第三个和第五个)foo
来自每个doFoo
函数(第二个和第四个)。doFoo2 中的一个是唯一与其他不同的,因为该语句testdict = {some:"new dict"}
创建了一个新对象,该对象绑定到该testdict
函数命名空间内的名称。该更改不会反映在foo
函数中,因为它的mydict
名称仍绑定到原始对象。
这是 Python 的一部分,与大多数其他编程语言不同。与 C 中变量名对应于内存中的特定位置的 C 不同,在 Python 中,名称指的是特定对象。如果再次分配给该名称,那只会将该名称重新绑定到另一个对象(根本不会影响原始对象,尽管如果没有其他对它的引用,它可能会被垃圾收集)。
这段代码的一部分(如 Pythonista演示文稿)对于理解这种区别非常有帮助。我认为它的“nametag”隐喻非常有助于理解名称绑定在 Python 中的工作原理。