[解決済み] Pythonのスワッピングを理解する:なぜa, b = b, aとb, a = a, bは必ずしも等価ではないのですか?
2022-04-23 13:19:28
質問
ご存知のように、2つのアイテムの値を交換するpythonicな方法は
a
と
b
は
a, b = b, a
と同等であるべきです。
b, a = a, b
ところが今日、あるコードを書いていたら、偶然にも以下の2つの入れ替えで異なる結果になることを発見しました。
nums = [1, 2, 4, 3]
i = 2
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
print(nums)
# [1, 2, 4, 3]
nums = [1, 2, 4, 3]
i = 2
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
print(nums)
# [1, 2, 3, 4]
これは私には理解しがたいことです。誰かここで何が起こったのか説明してくれませんか?Pythonのスワップでは、2つの代入は同時に独立して起こるものだと思っていました。
どのように解決するのですか?
から python.org
<ブロッククオートオブジェクトのターゲットリストへの代入は、オプションで括弧または角括弧で囲まれており、以下のように再帰的に定義されます。
...
- Else: オブジェクトは、ターゲットリスト内のターゲットと同じ数のアイテムを持つイテラブルでなければならず、アイテムは左から右へ、対応するターゲットに割り当てられる。
ということは、あなたの代入は
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
は、おおよそ
tmp = nums[nums[i]-1], nums[i]
nums[i] = tmp[0]
nums[nums[i] - 1] = tmp[1]
(もちろん、より良いエラーチェックをした上で)
一方、他の
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
は以下のようなものです。
tmp = nums[i], nums[nums[i]-1]
nums[nums[i] - 1] = tmp[0]
nums[i] = tmp[1]
つまり、どちらも右辺が先に評価されるわけです。しかし、その後、左辺の2個が順に評価され、評価後すぐに代入が行われます。決定的なのは、これは、左辺の第2項が評価されるのは、最初の代入が
すでに
されます。ですから、もしあなたが
nums[i]
を先に指定すると、その後に
nums[nums[i] - 1]
を更新した場合とは異なるインデックスを参照します。
nums[i]
2番目。
関連
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] Python 3 の "python -m SimpleHTTPServer" に相当するものは何ですか?
-
[解決済み] Pythonの関数内の静的変数に相当するものは何ですか?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Python Decorator 練習問題
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] Pythonで2つの変数を入れ替える標準的な方法はありますか?