在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的步骤所示,由于元组是一个不可变的对象,分配失败。