2017-10-26 7 views
1

にリストを持ったときに、私は次のコードの理解の問題が生じています:list.pop()関数の一覧状況

は、ここで私はコード化されている例を示します

listA=[] 
listB=[] 
listA.append(10) 
print(listA) 
listB.append(listA) 
print(listB) 
listA.pop() 
print(listA) 
print(listB) 

私は貝に期待していました私が得たもの

[10] 
[[10]] 
[] 
[[10]] 

しかし、現実には

だった:

次の結果をプリントアウト10

私はこれの背後にある論理を理解していません。コードを次のように変更した場合:

listA=[] 
listB=[] 
listA.append(10) 
print(listA) 
listB.append(listA) 
print(listB) 
listA=[] 
print(listA) 
print(listB) 

これは私が期待したものを得るでしょう。 2つのコードが異なる結果をもたらす理由は誰にでも分かりますが、コードの動作は同じですか?

+0

listAへの参照をlistBに保存してlistAを変更するので、listBも印刷すると変更されます。期待どおりの結果では、リストをコピーまたは複製し、参照を保持しないでください。 – xander

+0

これは、私がこの例で行ったことをやろうとしている場合、私はスタック関数を使用できないということですか? –

答えて

0

変数(Pythonで)はハンドルに似ています。 listAはあなたのリストが実際に存在する場所のちょうどハンドルです。 あなたは矢印が「ポイントへ」を意味し、このように見ている構造、組み立て:

initial structure

はその後、あなたの最初のケースでは、あなたはpop()を呼び出してから10を取りました。

reassignment

:しかし、後者の場合には、あなたがしたすべてが新しいリスト []にご Aハンドルを再割り当てした

pop

:しかし、それはそれ故に、それはこのように見えた、まだ同じ箱でした

0

あなたが混乱している理由はstringsのようなimmutableデータ型とは対照的に、Pythonlistsmutableであるということです。これは、reference-ではなく、であり、valueであることを意味します。

は、だから、呼び出すとき:あなたはlistBlistとしてlistAcontentsを追加していない

listB.append(listA) 

、あなたはlistAlistBからmemoryにある場合にreferenceを渡しています。

これは、あなたがpop()listAから10を削除すると、あなたがlistAためmemoryに場所を変更していることを意味します。したがって、printlistBの場合は、listAreferenceを検索し、内容が(poppedの場合は10)、printsの場合は空のlistであることがわかります。

secondcodeでは、あなたは何か違うことをしています(つまり、あなたと同じではありません)。ここでは、listemptyを作るためにlistAからpop10ない、あなたが代わりに行うことでemptylistlistAという名前の変数を再割り当て:

listA = [] 

以前listAとするためreferenceこれは、異なる結果を生成します[10]はまだlistBに保持されています。したがって、variablelistAを変更する場合は、新しいチャンクにmemoryという新しいチャンクを割り当てて、その内容を保存します。一方、[10]のメモリの古いチャンクは変更されず、listBは変更されずにそのまま[[10]]となります。