为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪9158850 2021-12-17 10:31:08
def new_val(x):    x['a'] = 5    return xb = {'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?
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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_FAST并STORE_FAST在b该b = b行。他们没有取得任何有用的成果,但他们被执行了。


查看完整回答
反对 回复 2021-12-17
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信