2016-01-09 35 views
22

出力を与えるコードスニペットは0 1 2 2です。 a[-1]はリストの番号3にアクセスしているので、私は出力3 3 3 3を期待していました。オンラインでの説明には、「各反復でa[-1]の値が変化します」と記載されていますが、どうやって、なぜそれほど理解できません。どんな説明も素晴らしいでしょう!forループと繰り返しリスト

a = [0, 1, 2, 3] 
for a[-1] in a: 
    print(a[-1]) 
+1

私はこれを見たことがありません。私は記事/チュートリアル/それが何であれ、この例を示すものを読んでみたいと思います。 – GingerPlusPlus

+3

また、おめでとうございます! (新しいSOユーザーの復活に対する信念) – GingerPlusPlus

+3

良い質問。ループ変数として 'a [-1]'が許されているのはなぜですか... – timgeb

答えて

15

ここで起こっていることは、ループ中にリストが突然変異していることです。

のは、コードスニペットを以下の点を考慮してみましょう:

a = [0, 1, 2, 3] 
for a[-1] in a: 
    print a 

出力は次のとおりです。

[0, 1, 2, 0] 
[0, 1, 2, 1] 
[0, 1, 2, 2] 
[0, 1, 2, 2] 

各イテレーション:

  • は現在、内部ポインタが指し示す位置
  • から値を読み込み、すぐに割り当てそれは最後の要素にその最後の要素の後にリスト
  • で標準出力にプリントされ

だからそれはのようになります:

    最初の要素への
  • 内部ポインタが、それは0だし、最後の要素は、その値で上書きされます。リストは[0, 1, 2, 0]です。印刷された値は0
  • です。内部ポインタが2番目の要素を指していれば、それは1であり、最後の要素はその値で上書きされます。リストは[0, 1, 2, 1]です。印刷された値は、最終ステップで内部ポインタが最後のステップを指している; 1
  • (...)
  • 最後の要素を指します。最後の要素はそれ自身で上書きされます。リストは最後の反復で変更されません。印刷された要素も変化しません。
34

for a[-1] in aをやっている間、あなたが実際にa[-1]にリストと一時ストアを介して現在の要素の値を繰り返します。

あなたは、これらの命令のようなループを参照することができます:あなたは第三の要素上にあるとき、そして21ある値(a[-1]に保存されますが、起動時に0前と3だったが、そう

a[-1] = a[0] # a = [0, 1, 2, 0] 
print(a[-1]) # 0 
a[-1] = a[1] # a = [0, 1, 2, 1] 
print(a[-1]) # 1 
a[-1] = a[2] # a = [0, 1, 2, 2] 
print(a[-1]) # 2 
a[-1] = a[3] # a = [0, 1, 2, 2] 
print(a[-1]) # 2 

を)。

最後に、最後の要素(および反復の最後)については、a[-1]に格納された最後の値は2で、なぜ2回印刷されるのかが説明されています。

関連する問題