def foo():
testdict = {'A': '1235', 'B': '6458', 'C': 54156}
dofoo(testdict)
def dofoo(testdict):
testdict['A'] = testdict['A'].replace('2', '')
当设置testdict['A']
时,对testdict
变量值的引用发生了什么?只有那件东西失去了原值吗?你知道吗
编辑:
因为如果我愿意:
def foo():
testdict = {'A': '1235', 'B': '6458', 'C': 54156}
dofoo(testdict)
def dofoo(testdict)
testdict = {'F' : '156', 'G' : '6875'}
那么引用就会丢失。如果你设置了一个这样的收藏项目,为什么不呢?你知道吗
testdict['A']的输出为0。你知道吗
这是因为dict作为引用传递到foo函数中。你知道吗
因此,当您将testdict传递给foo时,x不是testdict的一个副本,而是指向同一testdict的指针。当x['A']改变时,意味着testdict['A']也会改变。你知道吗
重要的是要了解在任何给定的时间,你用一个给定的名字所指的值是什么。我的意思是:
以下是我的系统上的输出(Windows 7上的64位Python 3.3):
打印了五个
id
值,其中三个(第一个、第三个和第五个)来自foo
,另一个来自每个doFoo
函数(第二个和第四个)。doFoo2中的一个是唯一一个与其他不相同的,因为语句testdict = {some:"new dict"}
创建了一个新对象,该对象绑定到该函数命名空间中的testdict
名称。这种变化不会反映在foo
函数中,因为它的mydict
名称仍然绑定到原始对象。你知道吗这是Python的一部分,与大多数其他编程语言不同。与C不同,C中的变量名对应于内存中的特定位置,而在Python中,名称是指特定对象。如果您再次指定名称,则只需将名称重新绑定到另一个对象(完全不影响原始对象,但如果没有其他引用,则可能会对其进行垃圾收集)。你知道吗
这个Code like a Pythonista演示的一部分对理解这种区别非常有帮助。我认为“nametag”这个比喻非常有助于理解Python中名称绑定的工作原理。你知道吗
相关问题 更多 >
编程相关推荐