目次
タプル内の値の交換: 内部を覗く
スタック操作
タプル構築とアンパック
最適化
ホームページ バックエンド開発 Python チュートリアル Python は一時変数を使用せずにタプル値をどのように交換しますか?

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

Nov 28, 2024 am 09:07 AM

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 までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

HTMLを解析するために美しいスープを使用するにはどうすればよいですか? HTMLを解析するために美しいスープを使用するにはどうすればよいですか? Mar 10, 2025 pm 06:54 PM

HTMLを解析するために美しいスープを使用するにはどうすればよいですか?

Pythonでの画像フィルタリング Pythonでの画像フィルタリング Mar 03, 2025 am 09:44 AM

Pythonでの画像フィルタリング

Pythonを使用してテキストファイルのZIPF配布を見つける方法 Pythonを使用してテキストファイルのZIPF配布を見つける方法 Mar 05, 2025 am 09:58 AM

Pythonを使用してテキストファイルのZIPF配布を見つける方法

Pythonを使用してPDFドキュメントの操作方法 Pythonを使用してPDFドキュメントの操作方法 Mar 02, 2025 am 09:54 AM

Pythonを使用してPDFドキュメントの操作方法

DjangoアプリケーションでRedisを使用してキャッシュする方法 DjangoアプリケーションでRedisを使用してキャッシュする方法 Mar 02, 2025 am 10:10 AM

DjangoアプリケーションでRedisを使用してキャッシュする方法

TensorflowまたはPytorchで深い学習を実行する方法は? TensorflowまたはPytorchで深い学習を実行する方法は? Mar 10, 2025 pm 06:52 PM

TensorflowまたはPytorchで深い学習を実行する方法は?

Pythonで独自のデータ構造を実装する方法 Pythonで独自のデータ構造を実装する方法 Mar 03, 2025 am 09:28 AM

Pythonで独自のデータ構造を実装する方法

Pythonオブジェクトのシリアル化と脱介入:パート1 Pythonオブジェクトのシリアル化と脱介入:パート1 Mar 08, 2025 am 09:39 AM

Pythonオブジェクトのシリアル化と脱介入:パート1

See all articles