将 Python 引用重新分配给自身时,它是取消分配并重新分配,还是什么都不做?
When reassigning a Python reference to itself, does it un-assign and re-assign, or do nothing?
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 的指针)是否曾经改变。
从技术上讲,'re-assign' 引用变量 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
如您所见,b = b
行在 b
上有 2 个操作 LOAD_FAST
和 STORE_FAST
。他们没有任何用处,但他们被处决了。
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 的指针)是否曾经改变。
从技术上讲,'re-assign' 引用变量 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
如您所见,b = b
行在 b
上有 2 个操作 LOAD_FAST
和 STORE_FAST
。他们没有任何用处,但他们被处决了。