ホームページ バックエンド開発 Python チュートリアル Pythonのコネクタ(+、+=)の例を詳しく解説

Pythonのコネクタ(+、+=)の例を詳しく解説

Jan 13, 2017 pm 04:11 PM

前書き

この記事では、サンプル コードで見つかった問題を通じて 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 サイトの関連記事に注目してください。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

Investing.comの反クローラーメカニズムをバイパスするニュースデータを取得する方法は? Investing.comの反クローラーメカニズムをバイパスするニュースデータを取得する方法は? Apr 02, 2025 am 07:03 AM

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

See all articles