Python 赋值谜语 A += B


在本章中,我们将了解当我们更新元组中的值时会发生什么,元组实际上是不可变的。我们将能够将新值与旧值合并,但这会引发错误。我们可以研究错误的字节码,并且更好地了解元组规则如何起作用。

首先,我们定义一个元组,然后发出一个命令来更新它的最后一个元素,如下所示。

示例

>>> tupl = (5,7,9,[1,4])
>>> tupl[3] += [6,8]

输出

运行以上的代码,将会给我们以下结果 −

Traceback (most recent call last):
File "", line 1, in
TypeError: 'tuple' object does not support item assignment
>>> tupl
(5, 7, 9, [1, 4, 6, 8])

现在我们学习上述方法的字节码,我们将代码放入一个函数,并应用 dis 方法来显示字节码。我们得到相同的错误,但更详细。

示例

def immut_function():
   tupl = (5,7,9,[1,4])
   tupl[3] += [6,8]
immut_function()

输出

运行以上的代码,将会给我们以下结果 −

TypeError Traceback (most recent call last)
in ()
      2 tupl = (5,7,9,[1,4])
      3 tupl[3] += [6,8]
----> 4 immut_function()
in immut_function()
      1 def immut_function():
      2 tupl = (5,7,9,[1,4])
----> 3 tupl[3] += [6,8]
4 immut_function()
TypeError: 'tuple' object does not support item assignment

接下来,我们显示以上函数的字节码,以查看元组赋值和错误的详细信息。

示例

import dis
dis.dis(immut_function)

输出

运行以上的代码,将会给我们以下结果 −

2   0 LOAD_CONST      1 (5)
    3 LOAD_CONST      2 (7)
    6 LOAD_CONST      3 (9)
    9 LOAD_CONST      4 (1)
   12 LOAD_CONST      5 (4)
   15 BUILD_LIST      2
   18 BUILD_TUPLE     4
   21 STORE_FAST   0 (tupl)
    3 24 LOAD_FAST   0 (tupl)
   27 LOAD_CONST 6 (3)
   30 DUP_TOPX 2
   33 BINARY_SUBSCR
   34 LOAD_CONST 7 (6)
   37 LOAD_CONST 8 (8)
   40 BUILD_LIST 2
   43 INPLACE_ADD
   44 ROT_THREE
   45 STORE_SUBSCR
   46 LOAD_CONST 0 (None)
   49 RETURN_VALUE

结论是不要将可变元素放入元组。尽管赋值是可能的,但它会引发异常。如步骤 46 中的值所示,由于元组是不可变对象,所以赋值会失败。

更新于: 03-7-2020

81 次浏览

开启你的 职业 生涯

完成课程即可获得认证

开始
广告