私はたまたまこのコードのスニペットを見ました:
a = []
a = [a, a, None]
# makes a = [ [], [], None] when print
a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print
a[:]
割り当てがポインターを割り当てているようですが、それに関するドキュメントが見つかりません。それで、誰かが私に明確な説明を与えることができますか?
私はたまたまこのコードのスニペットを見ました:
a = []
a = [a, a, None]
# makes a = [ [], [], None] when print
a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print
a[:]
割り当てがポインターを割り当てているようですが、それに関するドキュメントが見つかりません。それで、誰かが私に明確な説明を与えることができますか?
Python では、a
は名前です。オブジェクト (この場合はリスト) を指します。
最初の例では、a
最初に空のリストを指し、次に新しいリストを指します。
2番目の例ではa
、空のリストを指し、新しいリストの値を含むように更新されます。a
これは、リスト参照を変更しません。
最終結果の違いは、操作の右側が最初に評価されるため、どちらの場合もa
元のリストを指すことです。これは、最初のケースでは であったリストを指しa
、2 番目のケースではそれ自体を指し、再帰構造を作ることを意味します。
わかりにくい場合は、視覚化してご覧になることをお勧めします。
1 つ目は新しいオブジェクトを指しa
、2 つ目は mutatea
するため、参照されるリストa
は同じままです。
例えば:
a = [1, 2, 3]
b = a
print b # [1, 2, 3]
a[:] = [3, 2, 1]
print b # [3, 2, 1]
a = [1, 2, 3]
#b still references to the old list
print b # [3, 2, 1]
@pythonm 応答からのより明確な例
>>> a=[1,2,3,4]
>>> b=a
>>> c=a[:]
>>> a.pop()
4
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3, 4]
>>>