Python中的同时赋值语义

发布于 2021-01-29 18:08:10

考虑以下Python 3代码:

a = [-1,-1,-1]
i = 0

现在考虑同时在a和i上进行分配的以下两个版本:

作业版本1:

a[i],i = i,i+1

作业版本2:

i,a[i] = i+1,i

我希望同时分配的这两个版本在语义上是等效的。但是,如果您在每次同时分配之后检查a和i的值,则会得到不同的状态:

print(a,i)分配后版本1的输出:

[0, -1, -1] 1

print(a,i)分配后版本2的输出:

[-1, 0, -1] 1

我不是Python语义学方面的专家,但是这种行为似乎很奇怪。我希望两个分配的行为都与分配版本1相同。此外,如果您检查以下链接,可能会期望两个分配版本都导致相同的状态:

链接到Google图书中的书摘

关于同时分配的Python语义,我缺少什么吗?

注意 :例如,当变量a具有整数类型时,这种奇怪的行为似乎是不可再现的。它似乎要求a是列表类型(也许任何可变类型都是这种情况吗?)。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在这种情况下:

    i, a[i] = i + 1, i
    

    右侧求值为一个元组(1,0)。然后将该元组解包到i然后a[i]a[i] 拆包 期间
    而不是之前进行评估的,因此对应于a[1]

    由于在进行任何拆箱之前都会先评估a[i]右侧,因此a[0]无论最终值是多少,在右侧引用始终是i

    这是另一个无用的有趣例子供您锻炼

    >>> a = [0,0,0,0]
    >>> i, a[i], i, a[i] = range(4)
    >>> a
    [1, 0, 3, 0]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看