Python
 Computer >> コンピューター >  >> プログラミング >> Python

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のステップに示されているように、タプルは不変オブジェクトであるため、割り当ては失敗します。


  1. Pythonのissuperset()

    この記事では、Pythonでのissuperset()と、さまざまな分野でのその実装について学習します。 このメソッドは、セットBのすべての要素に引数として渡されるすべての要素セットAが含まれている場合はブール値Trueを返し、Aのすべての要素がBに存在しない場合はfalseを返します。 これは、BがAのスーパーセットである場合、それを意味します returns true; else False 例 いくつかの例を見てみましょう A = {'t','u','t','o','r','i',

  2. Pythonのさまざまな代入演算子タイプは何ですか?

    次の表は、すべての代入演算子を示しています- オペレーター 説明 例 = 右側のオペランドから左側のオペランドに値を割り当てます c =a+bからcへのa+bの値 + = 右のオペランドを左のオペランドに追加し、結果を左のオペランドに割り当てます c + =acにaを追加 -= 左のオペランドから右のオペランドを減算し、その結果を左のオペランドに割り当てます c-=cからaを引く * = 右のオペランドと左のオペランドを乗算し、その結果を左のオペランドに割り当てます c * =cにaを掛けて、cに割り当てます / = 左のオペランドを右のオペランドで除算し