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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

Pythonasyncioについて...

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。

Python 3.6のピクルスファイルの読み込みエラー:modulenotfounderror:nomodulenamed ...

SCAPYクローラーを使用するときにパイプラインファイルを作成できない理由についての議論は、SCAPYクローラーを学習して永続的なデータストレージに使用するときに、パイプラインファイルに遭遇する可能性があります...
