2

変数が設定されています。別の変数が最初に設定されます。最初は値を変更します。2番目はそうではありません。これは、黎明期からのプログラミングの性質です。

>>> a = 1
>>> b = a
>>> b = b - 1
>>> b
0
>>> a
1

次に、これを Python リストに拡張します。リストが宣言され、追加されます。別のリストが最初のリストと等しいと宣言されています。2 番目のリストの値が変更されます。不思議なことに、最初のリストの値は、直接作用するわけではありませんが、変化します。

>>> alist = list()
>>> blist = list()
>>> alist.append(1)
>>> alist.append(2)
>>> alist
[1, 2]
>>> blist
[]
>>> blist = alist
>>> alist.remove(1)
>>> alist
[2]
>>> blist
[2]
>>> 

どうしてこれなの?

そして、これが起こらないようにするにはどうすればよいですか? (もしそうなら、不変) alistへの変更に動じないようにしたいですか?blist

4

5 に答える 5

4

何が起こっているかというと、次の場合に同じリストへの別の参照を作成することです。

blist = alist

したがって、blistと同じリストを参照alistします。したがって、その 1 つのリストを変更すると、 と の両方に影響alistblistます。

参照を作成するだけでなく、リスト全体をコピーする場合は、次のようにします。

blist = alist[:]

実際、以下を使用して参照を自分で確認できますid()

>>> alist = [1,2]
>>> blist = []
>>> id(alist)
411260888
>>> id(blist)
413871960
>>> blist = alist
>>> id(blist)
411260888
>>> blist = alist[:]
>>> id(blist)
407838672

これは、 Python ドキュメントからの関連する引用です。:

Python の割り当てステートメントはオブジェクトをコピーせず、ターゲットとオブジェクトの間のバインディングを作成します。変更可能なコレクションまたは変更可能なアイテムを含むコレクションの場合、1 つのコピーを変更せずに他のコピーを変更できるように、コピーが必要になることがあります。

于 2013-07-18T12:47:17.087 に答える
1

この投稿に基づいて:

Python はオブジェクトへの参照を (Java のように) 値で渡し、Python のすべてはオブジェクトです。これは単純に聞こえますが、一部のデータ型は値渡しの特性を示しているように見え、他のデータ型は参照渡しのように動作しているように見えることに気付くでしょう...どうしたのでしょう?

可変オブジェクトと不変オブジェクトを理解することが重要です。文字列、タプル、数値などの一部のオブジェクトは不変です。関数/メソッド内でそれらを変更すると、新しいインスタンスが作成され、関数/メソッド外の元のインスタンスは変更されません。リストや辞書などの他のオブジェクトは変更可能です。つまり、オブジェクトをその場で変更できます。したがって、関数/メソッド内のオブジェクトを変更すると、元のオブジェクトも変更されます。

したがって、あなたの例では、変数を作成bListaListて同じオブジェクトを指しています。bListしたがって、いずれかから要素を削除すると、またはaList両方が指すオブジェクトに反映されます。

于 2013-07-18T12:51:47.230 に答える
0

「これはなぜですか?」という質問の短い答え 2: Python では整数は不変であるのに対し、リストは変更可能であるためです。

Python ドキュメントで公式リファレンスを探していました。このセクションをご覧ください: http://docs.python.org/2/reference/simple_stmts.html#assignment-statements

後者からの引用:

割り当てステートメントは、名前を値に (再) バインドし、変更可能なオブジェクトの属性または項目を変更するために使用されます。

私はこの文がとても好きで、今まで見たことがない。それはあなたの質問に正確に答えます。

このトピックに関する最近の優れた記事はhttp://nedbatchelder.com/text/names.htmlで、コメントの 1 つで既に言及されています。

于 2013-07-18T12:56:44.143 に答える