4

私はたまたまこのコードのスニペットを見ました:

a = []  
a = [a, a, None]
# makes a = [ [], [], None] when print

a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print

a[:]割り当てがポインターを割り当てているようですが、それに関するドキュメントが見つかりません。それで、誰かが私に明確な説明を与えることができますか?

4

3 に答える 3

7

Python では、aは名前です。オブジェクト (この場合はリスト) を指します。

最初の例では、a最初に空のリストを指し、次に新しいリストを指します。

2番目の例ではa、空のリストを指し、新しいリストの値を含むように更新されます。aこれは、リスト参照を変更しません。

最終結果の違いは、操作の右側が最初に評価されるため、どちらの場合もa元のリストを指すことです。これは、最初のケースでは であったリストを指しa、2 番目のケースではそれ自体を指し、再帰構造を作ることを意味します。

わかりにくい場合は、視覚化してご覧になることをお勧めします。

于 2013-03-04T12:51:11.013 に答える
7

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]
于 2013-03-04T12:51:27.360 に答える
0

@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]
>>> 
于 2013-03-04T16:24:28.387 に答える