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 中的值所示,由于元组是不可变对象,所以赋值会失败。
广告