前書き
この記事では、サンプル コードで見つかった問題を通じて Python のコネクタ (+、+=) を詳しく紹介します。これ以上は説明せずに、詳細な概要を見てみましょう。
次のコードがあるとします:
a = [1, 2, 3, 4] b = [5, 6, 7, 8, 9] c = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] for item in (a, b, c): item += [0] * (10 - len(item)) print a print b print c
このコードが意味するのは、リストが 3 つあり、長さが 10 になるように 10 以外の長さのリストの末尾を 0 で埋める必要があるということです。
出力は次のとおりです:
[1, 2, 3, 4, 0, 0, 0, 0, 0, 0] [5, 6, 7, 8, 9, 0, 0, 0, 0, 0] [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
ここでは問題ありません。すべて正常です。ただし、要件が変更され、10 以外の長さのリストの先頭をゼロで埋める必要があります。
そこで、次の変更を加えてみます:
a = [1, 2, 3, 4] b = [5, 6, 7, 8, 9] c = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] for item in (a, b, c): item = [0] * (10 - len(item)) + item print a print b print c
出力を直接見てみましょう:
[1, 2, 3, 4] [5, 6, 7, 8, 9] [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
結果は私たちが想像したものと異なります。問題が見つからない場合は、読み続けてください。もちろん、すでに手がかりを確認している場合は、ここで時間を無駄にする必要はありません。
私たちの固有の考え方によれば、次の例のように、上記の方法は実行可能です:
>>> l = [1, 2, 3, 4, 5] >>> l = [0]*5 + l >>> l [0, 0, 0, 0, 0, 1, 2, 3, 4, 5]
このような操作により、リストは私たちが期待する変更を取得できます。
しかし、さらにいくつかの手順を追加するとどうなるでしょうか:
>>> l = [1, 2, 3, 4, 5] >>> id(l) 139935500860952 >>> l = [0]*5 + l >>> l [0, 0, 0, 0, 0, 1, 2, 3, 4, 5] >>> id(l) 139935500783272
この時点で、すでに問題が発生していることが分かりましたか? id() メソッドの出力からわかるように、後ろの「l」は前の「l」ではなくなります。
以下の例を見てください:
>>> l = [1, 2, 3, 4, 5] >>> id(l) 139935500861024 >>> l += [0]*5 >>> l [1, 2, 3, 4, 5, 0, 0, 0, 0, 0] >>> id(l) 139935500861024
+= を使用する場合、「l」の前後に 1 が続きます。この時点で、記事の冒頭の例は説明できないわけではなく、理由があるという事実を理解する必要があります。
心配しないで、もう一度例を見てみましょう:
>>> t = (1, 2, 3, 4, 5) >>> id(t) 139935501840656 >>> t += (0,)*5 >>> t (1, 2, 3, 4, 5, 0, 0, 0, 0, 0) >>> id(t) 139935502151336
リストをタプルに置き換えると、結果が再び変化することがわかります。
それでは、タプルに対して + 演算を使用するとどうなるでしょうか:
>>> t = (1, 2, 3, 4, 5) >>> id(t) 139935501081200 >>> t = (0,)*5 + t >>> t (0, 0, 0, 0, 0, 1, 2, 3, 4, 5) >>> id(t) 139935502151336
これはリストの結果と同じであり、違いはありません。
次に、文字列を見てみましょう:
>>> s = "hello" >>> id(s) 139935500909712 >>> s += "world" >>> s 'helloworld' >>> id(s) 139935500909664
結果は、+= を使用して文字列を連結した後、「s」が再割り当てされ、前の変数ではなくなります。メモリに反映され、「s」は値を保存するための追加の記憶領域を開きます。
ここで、これから説明する Python コネクタは + と += です。これら 2 つの記号は Python では異なる意味を持ち、1 つは数学で使用される加算演算であり、もう 1 つはシーケンス型で使用されるスプライシング関数であることに注意してください。ただし、加算演算子として使用する場合は、この記事で説明する使用規則に従います。なぜなら、これら 2 つのシンボルについて議論することは、本質的に Python の不変と可変、つまり変数型と不変型について議論することになるからです。可変型の場合は変数をその場で変更できます。つまり、リストなどの記憶域は読み取り専用であり、必要に応じて変更できません。不変型に対して特定の操作を実行して新しい結果を取得するには、新しく生成された結果を保存するための新しい記憶領域を作成する必要があります。
上記の例から、次の結論を導き出すことができます:
変数タイプの場合:
+: 接続操作を表し、その結果は新しいオブジェクトを作成します。
+=: 追加操作、つまり、別のオブジェクトのコンテンツを所定のオブジェクトに追加するインプレイス操作を表します。
不変型の場合: + と += は両方とも接続演算または加算演算を表し、演算の結果は新しいオブジェクトを生成します。
記事の冒頭の例を分析しましょう。 for 反復は代入と同等なので、簡単にするために、以下に示すように a のみを分析します。
>>> a = [1, 2, 3, 4] >>> t = a >>> id(a) 139712695835400 >>> id(t) 139712695835400 >>> t += [0]*6 >>> t [1, 2, 3, 4, 0, 0, 0, 0, 0, 0] >>> id(t) 139712695835400 >>> id(a) 139712695835400 >>> a [1, 2, 3, 4, 0, 0, 0, 0, 0, 0] >>> >>> >>> a = [1, 2, 3, 4] >>> t = a >>> id(a) 139712695835464 >>> id(t) 139712695835464 >>> t = [0]*6 + t >>> t [0, 0, 0, 0, 0, 0, 1, 2, 3, 4] >>> a [1, 2, 3, 4] >>> id(a) 139712695835464 >>> id(t) 139712695835400
ここで、 t は a への参照です。 、これは記事の冒頭の例の項目に相当します。 += を使用して t を操作すると、実際には a が操作され、+= はその場で操作されるため、t が変更されると、a も変更され、+ を使用して t が操作され、その結果が t に代入されます。 , t はもはや a を指していませんが、[0]*6 + t を指しているため、a は変更されていません。
まとめ
以上がこの記事の全内容です、ここで議論していることは単純な問題ですが、この問題についてこれだけ長い時間をかけて話してきたので、私が言いたいのは、こういった小さな問題についてです。 , 十分に理解していないと、プログラミングの際にトラブルが発生する可能性があります。
Python のコネクタ (+、+=) の詳細な例については、PHP 中国語 Web サイトの関連記事に注目してください。