ホームページ >バックエンド開発 >Python チュートリアル >Python は一時変数を使用せずにタプル値をどのように交換しますか?
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 サイトの他の関連記事を参照してください。