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?
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
如你所见,LOAD_FAST
上的STORE_FAST
和b
有2次操作。它们没有任何用处,但却被执行了。