ホームページ >バックエンド開発 >Python チュートリアル >Python は一時変数を使用せずにタプル値をどのように交換しますか?

Python は一時変数を使用せずにタプル値をどのように交換しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-28 09:07:10315ブラウズ

How does Python swap tuple values without using a temporary variable?

タプル内の値の交換: 内部を覗く

Python では、(a, b) = (b, a) のようなタプル代入を使用して 2 つの変数の値を交換します。単純なトリックのように思えるかもしれませんが、一時変数なしで内部的にはどのように動作するのでしょうか?

スタック操作

Python は、代入の右側の式を左側とは別に評価します。右辺が計算されると、その結果はスタックに格納されます。次に、スタック上で直接動作するオペコードを使用して左側の名前が割り当てられます。

2 つまたは 3 つの項目を含むタプル割り当ての場合、Python は ROT_TWO または ROT_THREE オペコードを使用してスタックを直接利用して要素を交換します。例:

def foo(a, b):
    a, b = b, a

dis.dis(foo) を使用してこの関数を逆アセンブルすると、次のことがわかります:

  2           0 LOAD_FAST                1 (b)
              3 LOAD_FAST                0 (a)
              6 ROT_TWO             
              7 STORE_FAST               0 (a)
             10 STORE_FAST               1 (b)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        

ここで、ROT_TWO はスタック上の上位 2 つの値を交換し、事実上、 a と b の順序。

タプル構築とアンパック

3 つ以上の要素を含む代入の場合、Python はスタック上に中間タプルを構築します。次の例を考えてみましょう。

def bar(a, b, c, d):
    d, c, b, a = a, b, c, d

その逆アセンブリは次のようになります。

  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 LOAD_FAST                2 (c)
              9 LOAD_FAST                3 (d)
             12 BUILD_TUPLE              4
             15 UNPACK_SEQUENCE          4
             18 STORE_FAST               3 (d)
             21 STORE_FAST               2 (c)
             24 STORE_FAST               1 (b)
             27 STORE_FAST               0 (a)
             30 LOAD_CONST               0 (None)
             33 RETURN_VALUE        

BUILD_TUPLE はスタック上の値から逆の順序でタプルを構築します。次に、UNPACK_SEQUENCE はタプルをポップし、その要素を左側の変数に割り当てるためにスタックに戻します。

最適化

UNPACK_SEQUENCE は 2 つまたは 3 つの項目の割り当てでは冗長に見えますが、後の最適化ステップでは、BUILD_TUPLE/UNPACK_SEQUENCE コンボをより効率的なものに置き換えます。 ROT_TWO または ROT_THREE オペコード。スワップ メカニズムが可能な限り合理化されるようにします。

以上がPython は一時変数を使用せずにタプル値をどのように交換しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。