2012-03-20 12 views
7

***編集:私は元の例では不注意でした。この動作は、リストAを自分自身に追加するときではなく、のリストを追加するときに、リストAをA自身に含めるときに発生します。下記の修正された例をご覧ください。 省略記号リスト[...]とPythonでリストを連結する


私は省略記号リスト([...]として表示され、あなたがリストの参照自体を持っているときに発生するこれらのリスト)はPythonでどのように動作するかを理解しようとしています(2)。

は特に、私はAがリストである場合は、A = A + AA += A(およびA.append(A))である

に異なる動作をすると思われる理由、知りたい、なぜあなたが得るのですか:

>>> a = [1, 2] 
>>> a = a + [a] 
>>> a 
[1, 2, [1, 2]] 

対。

>>> a = [1, 2] 
>>> a += [a] 
>>> a 
[1, 2, [...]] 

(a)は後者がやったとして私のために動作するようです(そのa.appendに注意してください。)

この省略記号リスト現象に関するさらに一般的な情報は、事柄を明確にすることができれば、非常に高く評価されます。

ありがとうございました。

+0

http://stackoverflow.com/questions/2347265/what-does-plus-equals-do-in-python – Dogbert

+1

'= [1、2]。 a + = a'は '[1,2、[1,2]]ではなく、[1,2,1,2]となります。重複した質問を参照してください。 – khachik

+1

いわゆる重複は省略記号リストは*すべての*については説明しません。 – Marcin

答えて

6

編集:(質問には、編集内容が提起した追加的な問題に対処するために):

a = a + ba += b同じ操作ではありません。前者はa.__add__(b)を実行し、後者はa.__iadd__(b)を実行します(「インプレース追加」)。

2つの違いは、前者は常に新しいオブジェクトを作成し(その新しいオブジェクトに名前aを再バインドします)、後者はオブジェクトをインプレースで変更します(リストを使用すると、 )。

>>> a = [1, 2] 
>>> id(a) 
34660104 
>>> a = a + [a] 
>>> id(a) 
34657224 
>>> id(a[2]) 
34660104 

「新しい」aが最初に参照を連結し、その後、古いリストaから値を取って、ゼロから構築した:、これを説明するだけで、あなたのオブジェクトのアドレスを見て

それに古いオブジェクト。

コントラストこれに:

>>> a = [1, 2] 
>>> id(a) 
34658632 
>>> a += [a] 
>>> id(a) 
34658632 
>>> id(a[2]) 
34658632 

(旧答え、説明の循環参照):

これを考えてみましょう:

>>> a = [1, 2]; a += a 
>>> a 
[1, 2, 1, 2] 
>>> a = [1, 2]; a.extend(a) 
>>> a 
[1, 2, 1, 2] 
>>> a = [1, 2]; a += [a] 
>>> a 
[1, 2, [...]] 
>>> a = [1, 2]; a.append(a) 
>>> a 
[1, 2, [...]] 

をだから、最初の部分を要約する:

リストでは、a += aは、この操作の開始時にaで見つかった要素のコピーを追加して、インプレースaを変更​​を呼び出すのと同じです。

は逆に、a += [a]リストaへの参照を作成両方とも、a.append(a)に対応する(すなわちする。メモリ内のアドレスへのポインタ)とリストにことを追加します。これは、いわゆる「循環基準」を構成する。

あなたはその時点でaの内部表現を見ていたならば、それは次のようになります。

a: Reference to a list object at address 0xDEADBEEF 
a[0]: Reference to the integer object "1" 
a[1]: Reference to the integer object "2" 
a[2]: Reference to the same list object at address 0xDEADBEEF 

古いバージョンのPython(前1.5.1)がそれを検出するのに十分にスマートではなかったですあなたがprint aを行うことであるかのように、あなたは無限ループに[1, 2, [1, 2, [1, 2, [1, 2, [1, 2, [1, 2, ...などを取得したいです。 Python 1.5.1以降、インタプリタはこれを検出して代わりに[1, 2, [...]]を出力します。

0

次のことを考えてみましょう:

In [179]: a = [1, 2] 

In [180]: a+=a 

In [181]: a 
Out[181]: [1, 2, 1, 2] 

In [182]: a.append(a) 

In [183]: a 
Out[183]: [1, 2, 1, 2, [...]] 

In [184]: a[5] 
----------------------------------------------- 
IndexError        Trace 
C:\Users\Marcin\Documents\oneclickcos\oneclickc 
----> 1 a[5] 

IndexError: list index out of range 

In [185]: a[4] 
Out[185]: [1, 2, 1, 2, [...]] 

In [186]: a[3] 
Out[186]: 2 

In [187]: a[4] 
Out[187]: [1, 2, 1, 2, [...]] 

In [188]: a 
Out[188]: [1, 2, 1, 2, [...]] 

In [189]: a[4][3] 
Out[189]: 2 

In [190]: a[4][4] 
Out[190]: [1, 2, 1, 2, [...]] 

In [191]: a[4][5] 
----------------------------------------------- 
IndexError        Trace 
C:\Users\Marcin\Documents\oneclickcos\oneclickc 
----> 1 a[4][5] 

IndexError: list index out of range 

In [192]: a[4][4] 
Out[192]: [1, 2, 1, 2, [...]] 

In [193]: a = [1, 2] 

In [194]: a+=a 

In [195]: a 
Out[195]: [1, 2, 1, 2] 

In [196]: a 
Out[196]: [1, 2, 1, 2] 

In [197]: a 
Out[197]: [1, 2, 1, 2] 

In [198]: a.append(a) 

In [200]: a 
Out[200]: [1, 2, 1, 2, [...]] 

In [201]: a.append(a) 

In [202]: a 
Out[202]: [1, 2, 1, 2, [...], [...]] 

In [203]: a[4] 
Out[203]: [1, 2, 1, 2, [...], [...]] 

In [204]: a[5] 
Out[204]: [1, 2, 1, 2, [...], [...]] 

In [205]: id(a) 
Out[205]: 64692680L 

In [206]: id(a[5]) 
Out[206]: 64692680L 

In [207]: id(a[4]) 
Out[207]: 64692680L 

In [208]: id(a) == id(a[4]) and id(a[4]) == id(a[5]) 
Out[208]: True 

お知らせ最初にすべてのことの+=は省略記号のリストを作成しません。外側のリストほぼ確実に、を省略記号リストは、外側のリストへのポインタを表す(または -

第二に、省略記号リストは、そのスロットをaccesingする全く同じリストが返されることを示していることがわかりますネストのレベルが複数ある場合)。

関連する問題