ホームページ  >  記事  >  バックエンド開発  >  Pythonの代入とコピー

Pythonの代入とコピー

不言
不言オリジナル
2018-04-19 11:43:371286ブラウズ

この記事では、Python の代入とコピーの知識を理解するための記事を紹介しますので、興味のあるお友達はぜひ一緒に見てください

変数と代入

Python では、すべてが次のとおりです。オブジェクト、オブジェクトは「変数名」参照を渡します。「変数名」はより正確には「名前」と呼ばれます。私たち一人ひとりが自分の名前を持っているのと同じように、人を名前で参照し、オブジェクトを参照します。コード内の名前。

変数の割り当ては、名前をオブジェクトにバインドするものであり、オブジェクトをコピーするものではありません。私たちが生まれたときに両親が名前を付けるのと同じように、誰かにニックネームを付けることは、余分な人物を作成するのではなく、余分な名前を作成するだけです。

2 つのオブジェクトを比較するには、is と == の 2 つの方法があります。is は、2 つのオブジェクトが同じであるかどうかを、オブジェクトの ID 値によって識別できます。値は等しいですか?テーブルの上に置かれたリンゴは、実際には 2 つの異なる物体です。

>>> x1 = [1,2]
>>> x2 = [1,2]
>>> x1 is x2
False
>>> id(x1)
4338854088
>>> id(x2)
4338904392
>>> x1 == x2
True

前に述べたように、代入はオブジェクトに名前をバインドすることです。ここでは、x2 に対応するオブジェクトに新しい名前をバインドします。これは、最初はテーブルにリンゴを置くようなものです。これは本質的に同じリンゴなので、x2 と x3 は実際には同じオブジェクトを参照します。

x2 を通じてオブジェクトを変更すると、x3 もそれに応じて変更されます。これは、本質的には同じオブジェクトであるためです。これは、Zhang San と Xiao Zhang が同一人物である場合と同じで、Zhang San に服を追加することは実際には追加することになります。シャオ・チャンに服を。

>>> x3 = x2
>>> x3 is x2
True
>>> id(x3)
4338904392

しかし、x2 を再割り当てすると、x2 は以前のオブジェクトを参照せず、新しいオブジェクトを参照し、x3 は引き続き以前のオブジェクトを参照することを意味します。たとえば、テーブル上の大きなリンゴには x2 と x3 という 2 つのラベルがあります。x2 に値を再割り当てすることは、x2 ラベルを別のリンゴに付けることと同じですが、x3 は古いリンゴに付けられたままになります。

>>> x2.append(3)
>>> x2
[1, 2, 3]
>>> x3
[1, 2, 3]

オブジェクトのコピー

ビジネスではオブジェクトをコピーする必要がある場合がありますが、元のオブジェクトに副作用を与えたくない場合があります。これは、代入によって解決することはできません。新しい変数への値 (代入 (オブジェクトのコピーではない) のため、Python は特に、元のオブジェクトに基づいて同じ値を含むオブジェクトを迅速に作成するコピー メカニズムを提供します。この機能はコピー モジュールによって提供されます。 コピーは浅いコピーと深いコピーに分けられます。

>>> x2 = [3, 4]
>>> x3
[1, 2, 3]

コピーされたオブジェクトは同じ値を持つだけで、実際には異なるオブジェクトです

>>> s = [1,2,3]>>> sc = copy.copy(s) # 浅拷贝>>> sc[1, 2, 3]
>>> sdc = copy.deepcopy(s) # 深拷贝
>>> sdc
[1, 2, 3]

では、浅いコピーと深いコピーの違いは何でしょうか?

整数、文字列、タプル、およびこれらの不変オブジェクトで構成されるコレクション オブジェクトなどの不変オブジェクトの場合、浅いコピーと深いコピーに違いはありません。どちらも新しいオブジェクトをコピーします

この 2 つの違いは、いつコピーされるかです。リスト内のリスト、辞書または辞書内のリストなどのオブジェクトを結合する場合、浅いコピーでは外側のシェルのみがコピーされ、内側の要素はコピーされません。一方、深いコピーではシェルと内側の要素が結合され、新しいコピーが作成されます。

例を見てみましょう:

>>> s == sc == sdc 
True
>>> s is sc 
False
>>> s is sdc
False

xの値を変更すると、aもそれに応じて変更されます。

>>> x = [2, 3]
>>> y = [7, 11]
>>> z = [x, y]
>>> a = copy.copy(z) # 浅拷贝
>>> a[0] is z[0]
True

ディープコピーの場合、内部の要素も再度コピーされ、xとyと同じ値を持つ2つの要素がコピーされます。xとyの値を変更してもbの影響には影響しません。

リスト z[:] のスライスのコピー、またはオブジェクトのコピー メソッド list.copy() の呼び出しはすべて浅いコピーです。カスタム オブジェクトの場合、__copy__ メソッドと __deepcopy__ メソッドを自分で実装することもできます

関連する推奨事項:

Python 代入ステートメント後のカンマの役割の分析

Python 代入操作メソッドの共有


以上がPythonの代入とコピーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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