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

Pythonで2つの変数を1行で入れ替える(スワップする)方法

この記事では、Pythonを使って2つの変数をたった1行で入れ替える(スワップする)方法を解説します。多くのプログラミング言語では一時的な変数が必要になりますが、Pythonなら驚くほどシンプルに実現できます。

基本的な書き方

Pythonで変数を交換する標準的な方法は以下の通りです。

>>> a = 20; b = 30
>>> a
20
>>> b
30
>>> # 変数を1行で入れ替える
>>> a, b = b, a
>>> a
30
>>> b
20

上記のコードを実行すると、ab の値が正しく入れ替わっていることが確認できます。ポイントは a, b = b, a というたった1行だけです。

仕組みの解説

なぜこれで値が入れ替わるのでしょうか? その鍵はPythonの評価順序にあります。

Pythonは式を基本的に左から右へ評価しますが、代入文を評価する際には、右辺が左辺よりも先に評価されるというルールがあります。

このルールに基づいて、a, b = b, a の動作を順番に見ていきましょう。

ステップ1:右辺の評価

まず右辺の b, a が評価されます。このとき、メモリ上に2つの要素を持つタプルが新しく作成されます。タプルの各要素は、この命令が実行された時点で識別子 ba が参照していたオブジェクトです。

ステップ2:タプルの一時保持

タプルは作成されましたが、この時点ではまだどの変数にも代入されていません。しかし問題ありません。Pythonは内部的にそのタプルの場所を把握しているためです。

ステップ3:左辺へのアンパック(代入)

次に左辺が評価されます。左辺は ab という2つの識別子で構成されているため、先ほど作成されたタプルはアンパック(展開)されます。その結果、以下のように同時に代入が行われます。

  • 左側の1番目の識別子 a に、タプルの1番目の要素(元の b の値)が代入される
  • 左側の2番目の識別子 b に、タプルの2番目の要素(元の a の値)が代入される

まとめ

a, b = b, a という式では、「右辺の1番目の値が左辺の1番目へ、右辺の2番目の値が左辺の2番目へ」という代入が同時に行われます。この仕組みにより、一時変数を使うことなく、aとbの値を1行で美しく入れ替えられるのです。

ちなみに、このテクニックは3つ以上の変数にも応用できます。例えば a, b, c = c, a, b と書けば、3つの変数をまとめてローテーションさせることが可能です。これはPythonの「タプルのパッキング/アンパッキング」という言語機能によるもので、Pythonらしい簡潔で読みやすいコードの代表例といえます。

  1. 【Python・Matplotlib】散布図に線を重ねて描画(オーバープロット)する方法

    PythonのMatplotlibでは、scatter()メソッドでデータポイントの散布図を作成した後、plot()メソッドを使うことで、その散布図の上に自由に線を重ねて描画(オーバープロット)できます。回帰直線や基準線を可視化したい場合などに非常に便利なテクニックです。 実装の手順 figure()メソッドを使って、サイズ(4, 3)の新しい図を作成するか、既存の図をアクティブにします。 plt.axes()で現在の図に軸を追加し、それをカレントのAxesとして取得します。 scatter()メソッドで散布図のポイントを描画します。 ax.plot()メソッドで線を描画し、散布図の上に重ね

  2. Pythonで2つのプロットを並べて作成する方法【matplotlibのsubplot活用】

    matplotlibのsubplot(row, col, index)メソッドを使うと、1つの図(figure)を行数×列数の領域に分割し、指定したインデックスの位置にそれぞれグラフを描画できます。本記事では、このメソッドを利用して、1つの図の中に2つのグラフを横並びで作成する方法を解説します。 実装の手順 numpyを使って、x座標と2種類のy座標(y1、y2)のデータポイントを作成します。 nrows=1、ncols=2、index=1を指定してsubplot()メソッドを呼び出し、現在のfigureに最初のサブプロットを追加します。 plot()メソッドで、xとy1のデータを使って折れ