0
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?
4

1 回答 1

2

b = b不是操作。先前b变量保存的数据被重新分配给一个新变量,该变量的名称也是b. 所以它什么也不做,但不会被忽视。

不要相信我的话。让我们反汇编你的最后一个例子:

def f():
    b = {}
    b = b

import dis

print(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_FASTSTORE_FASTon 。他们没有取得任何有用的成果,但他们被执行了。bb = b

于 2019-03-26T21:38:29.720 回答