47352


現状困っているという訳ではないのですが、（正確には、この挙動を知らなかったので、困っていたのですが、）`Python`の理解を深めたいために質問します。

[code]

    l = [1, 2, 3] 
    list(l).pop(0)
    print(l)
    
[/code]

**結果：**

[code]

    [1, 2, 3]
    
[/code]

逆に、

[code]

    l = [1, 2, 3] 
    l.pop(0)
    print(l)
    
[/code]

**結果:**

[code]

    [2, 3]
    
[/code]

本当は、取り出していないのではないかと思ったので、

[code]

    print(list(l).pop(0))
    
[/code]

結果：

[code]

    1
    
[/code]

通常、`pop`は、あるシーケンスの中にある要素を、一つ取り出します。ここでは0が指定されていますから、最初の要素を取り出します。  
要素を取り出された場合、その要素は、取り除かれるので、シーケンスの長さは１減少し、取ればとるほどシーケンスからは、要素が減っていきます。空のリストにpopを適用すると、当然エラーが発生します。それが今までどんな場合でもそうなのであると思い込んでいたのですが、上記のようなコードの場合では、そうはなりませんでした。  
この原因をちょっと調べてみたのですが、自分ではわかりませんでした。  
この挙動はどうしてなのでしょうか？もしわかる方がいらっしゃれば、お願いします。  
  
公式の説明：

> pop()(原文)  
>  s から任意の要素を取り除き、それを返します。集合が空の場合、 KeyError を送出します


CC BY-SA 4.0
2018-08-08T11:36:55.227
47350
2018-08-08T12:06:25.053
2018-08-08T11:40:45.900
19110
24284
question
python python3
list()メソッドでリスト化したpopメソッドでは、内容が変化しないのはなぜでしょうか？


関数・メソッドを順に追ってみてはどうでしょうか。

`list()`を使った場合は`()`の中の要素を元にリストを **新たに作成** しているので、質問文で書かれた以下の記述において`pop`の操作対象は
**元のリストのいわばコピー** です。元のリストに対して手を加えているわけではありません。

[code]

    l = [1, 2, 3] 
    list(l).pop(0) # [1,2,3].pop(0) と等価
    
[/code]

一方で`l.pop(0)`の方は操作対象の配列を直接指定しているので、結果も意図した通り元の配列から要素が削除されているはずです(こちらが正しい記述かと)。


CC BY-SA 4.0
2018-08-08T12:06:25.053
47352
2018-08-08T12:06:25.053
3060
47350
answer