猿问

将 Python 引用重新分配给自身时,它是取消分配并重新分配,还是什么都不做?

def new_val(x):

    x['a'] = 5

    return x


b = {'a': 2}

b = new_val(b) # b re-assigned to ret val

由于字典是可变的,b 是一个指向字典的引用指针,我们将这个指针传递给函数 new_val。


对字典的引用没有改变,但是字典对 2 的引用变成了 5。


原始变量 b 现在应该有 'a' 映射到 5。但是,我想知道对字典的引用(换句话说,变量 b 的指针)是否会改变。


从技术上讲,我们将引用变量 b 重新分配给恰好相同的引用。


在低水平上,会发生什么?这是否像一个无操作,其中一些逻辑识别出引用是相同的,或者引用实际上被取消分配并重新分配?


也许一个更简单的例子是:


b = {}

b = b # At a low level, what does this line do?


慕田峪9158850
浏览 111回答 1
1回答

largeQ

b = b是不是无操作。先前b变量持有的数据被重新分配给一个新变量,其名称也是b。所以它什么都不做,但不会被忽略。不要相信我的话。让我们反汇编你的最后一个例子:def f():    b = {}    b = bimport disprint(dis.dis(f))  2           0 BUILD_MAP                0              3 STORE_FAST               0 (b)  3           6 LOAD_FAST                0 (b)              9 STORE_FAST               0 (b)             12 LOAD_CONST               0 (None)             15 RETURN_VALUE正如你看到有2个操作LOAD_FAST并STORE_FAST在b该b = b行。他们没有取得任何有用的成果,但他们被执行了。
随时随地看视频慕课网APP

相关分类

Python
我要回答