当项目被删除后,列表引用会发生什么

2024-09-25 00:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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'}

那么引用就会丢失。如果你设置了一个这样的收藏项目,为什么不呢?你知道吗


Tags: 项目编辑foodefreplacedofootestdict原值
2条回答
testdict = {'A': '1235', 'B': '6458', 'C': 54156}

def foo(x):
    x['A'] = 0;

foo(testdict)

print testdict['A']

testdict['A']的输出为0。你知道吗

这是因为dict作为引用传递到foo函数中。你知道吗

因此,当您将testdict传递给foo时,x不是testdict的一个副本,而是指向同一testdict的指针。当x['A']改变时,意味着testdict['A']也会改变。你知道吗

重要的是要了解在任何给定的时间,你用一个给定的名字所指的值是什么。我的意思是:

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中,名称是指特定对象。如果您再次指定名称,则只需将名称重新绑定到另一个对象(完全不影响原始对象,但如果没有其他引用,则可能会对其进行垃圾收集)。你知道吗

这个Code like a Pythonista演示的一部分对理解这种区别非常有帮助。我认为“nametag”这个比喻非常有助于理解Python中名称绑定的工作原理。你知道吗

相关问题 更多 >