80988

[code]

    a = [1]
    b = a
    a.clear()
    print(b)
    
[/code]

結果

[code]

    []
    
[/code]

どうしてでしょうか？  
@ver.3.8.4

追記  
[python リストの要素を消す際のclear関数の注意点と対策](https://it-for-
pharma.com/python-%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E6%B6%88%E3%81%99%E9%9A%9B%E3%81%AEclear%E9%96%A2%E6%95%B0%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9%E3%81%A8%E5%AF%BE%E7%AD%96)

こちらのサイトでそれらしきことに言及されていたのですが、同じことなのでしょうか？


CC BY-SA 4.0
2021-08-23T09:34:23.690
80987
2021-08-23T15:39:28.303
2021-08-23T12:17:54.303
19110
47863
question
python python3
clear するとコピーしていた変数も変わってしまう


変数 `a` に代入されたオブジェクトを, 変数 `b` に代入すると, 同じものが入ります  
`id()` で比較すると同じオプジェクトであることが分かる

[code]

    >>> a = [1]
    >>> id(a)
    140486539736384
    >>> b = a
    >>> id(b)
    140486539736384
    
[/code]

コピーする場合は, 次のように行うと, 別のオブジェクトになる

[code]

    >>> b = a.copy()
    >>> id(b)
    140486539736192
    >>> a.clear()
    >>> b
    [1]
    
[/code]

コピーには, 浅い (shallow) コピー, 深い (deep) コピーなどもあります

参考: <https://docs.python.org/ja/3/library/copy.html>

* * *

追記のサイトの記事は, だいたい似たようなことかな

* * *

#### 追記

説明が不十分な気がするので, 追記

[code]

    a = 3.141592
    b = a
    
[/code]

この場合も, 同じ数値オブジェクトが入ります。  
けれど, ミュータブル / イミュータブル なオブジェクトで違いがあり  
数値オブジェクトは書き換え不可なため, 次のような演算でも別のオブジェクトになります  
なので, この場合 `b` は影響受けません

[code]

    a += 1
    
[/code]

参考:

  * (docs.python.org) [データモデル](https://docs.python.org/ja/3/reference/datamodel.html)
  * (docs.python.org) [なぜ list 'y' を変更すると list 'x' も変更されるのですか?](https://docs.python.org/ja/3/faq/programming.html?highlight=%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB#why-did-changing-list-y-also-change-list-x)


CC BY-SA 4.0
2021-08-23T09:51:26.467
80988
2021-08-23T15:39:28.303
2021-08-23T15:39:28.303
43025
43025
80987
answer