1. ホーム
  2. python

[解決済み] 空のリストへの代入(例:[] = "")は、なぜエラーにならないのでしょうか?

2022-10-03 07:36:51

質問

Python 3.4で、私は次のように入力しています。

[] = "" 

で、Exceptionが発生せず、正常に動作します。しかし、もちろん [] とは等しくありません。 "" の後に

[] = ()

も問題なく動作します。

"" = []

は予想通り例外を発生させますが

() = ""

は予想通り例外を発生させますが。では、どうなっているのでしょうか?

どうすれば解決するのか?

等しいかどうかを比較していない。あなたは 代入 .

Pythonでは、複数のターゲットに割り当てることができます。

foo, bar = 1, 2

は二つの値を foobar をそれぞれ使用します。必要なのは シーケンス または イテラブル を右辺に、名前のリストまたはタプルを左辺に記述します。

そうすると

[] = ""

を指定した場合 空の シーケンス(空の文字列もシーケンスです)を空の名前のリストに割り当てています。

するのと本質的に同じことです。

[foo, bar, baz] = "abc"

ここで、最終的に foo = "a" , bar = "b"baz = "c" と同じですが、文字数が少なくなっています。

ただし、文字列に代入することはできないので "" は決して機能せず、常にシンタックスエラーとなります。

を参照してください。 アサインメント ステートメント ドキュメント :

代入文は式リスト(これは単一の式またはカンマで区切られたリストであり、後者はタプルを生成することを覚えておいてください)を評価し、単一の結果のオブジェクトを左から右へ、ターゲットリストのそれぞれに割り当てます。

ターゲットリストへのオブジェクトの割り当て。 括弧または角括弧で囲むこともできます。 は再帰的に次のように定義されます。

強調 .

Pythonが空のリストに対してシンタックスエラーを投げないのは、実はちょっとしたバグなのです! 公式に文書化された文法は、空のターゲットリストを許さず、空の () ではエラーが発生します。 以下はその例です。 バグ 23275 無害なバグと考えられています。

出発点は、これが非常に長い間存在し、無害であることを認識することです。

また なぜ空のリストへの代入は有効で、空のタプルへの代入は無効なのですか?