内容
破壊、非破壊の定義がいまいち分かりません。
元のリストを破壊するか否かの区分だと認識していたのですが、以下の見る限
ex1 = (1, 2, 3)
ex2 = (4, 5, 6)
ex3 = ex1 + ex2
print(ex3)
(1, 2, 3, 4, 5, 6)
ex3 += (7, 8, 9)
print(ex3)
(1, 2, 3, 4, 5, 6, 7, 8, 9)
上記のコードで、ex3は元のリストから変わっていると思ったのですが。
宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
破壊的に中身を変更できるlistとできないtupleを比較してみてください。
>>> tuple1 = (1, 2, 3) >>> tuple2 = (4, 5, 6) >>> tuple3 = tuple1 + tuple2 >>> print(tuple3) (1, 2, 3, 4, 5, 6) >>> tuple4 = tuple3 >>> print(id(tuple3)) 4358041504 >>> print(id(tuple4)) 4358041504 >>> tuple3 += (7, 8, 9) >>> print(tuple3) (1, 2, 3, 4, 5, 6, 7, 8, 9) >>> print(tuple4) (1, 2, 3, 4, 5, 6) >>> print(id(tuple3)) 4347223376 >>> print(id(tuple4)) 4358041504
破壊的に中身を変更できないtupleでは+=
で中身の変更は起きません。
tuple3 += (7, 8, 9)
を実行しても、元のオブジェクトは変化せず新しいオブジェクトが再束縛されています。
実行前と後でid
関数の返り値が違うことが分かります。
>>> list1 = [1, 2, 3] >>> list2 = [4, 5, 6] >>> list3 = list1 + list2 >>> print(list3) [1, 2, 3, 4, 5, 6] >>> list4 = list3 >>> print(id(list3)) 4354511168 >>> print(id(list4)) 4354511168 >>> list3 += [7, 8, 9] >>> print(list3) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print(list4) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print(id(list3)) 4354511168 >>> print(id(list4)) 4354511168
破壊的に中身を変更できるlistでは+=
で中身の変更が起きています。
list3 += [7, 8, 9]
を実行しすると、元のオブジェクトが変化するだけで新しいオブジェクトの再束縛は起きません。
実行前と後でid
関数の返り値が同じことが分かります。
同じオブジェクトに束縛されているlist4
を評価すると同じように変化しています。
https://docs.python.org/ja/3/reference/simple_stmts.html#augmented-assignment-statements
また、実際の処理として、可能ならば インプレース (in-place) 演算が実行されます。これは、代入時に新たなオブジェクトを生成してターゲットに代入するのではなく、以前のオブジェクトの内容を変更するということです。
「可能ならばインプレース演算が実行されます」と書いてあります。可能でないならインプレース演算にはならないということでもあり、tupleでは実際インプレース演算になりません。
投稿2020/11/17 23:44
総合スコア11314
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こういうことでしょうか。
Python
1>>> lst1 = [1, 2, 3] 2>>> lst2 = lst1 3>>> 4>>> lst2 += [4, 5, 6] 5>>> lst1, lst2 6([1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6])
Python
1>>> tpl1 = (1, 2, 3) 2>>> tpl2 = tpl1 3>>> 4>>> tpl2 += (4, 5, 6) 5>>> tpl1, tpl2 6((1, 2, 3), (1, 2, 3, 4, 5, 6))
リストの += は破壊的です。
一方、タプルの += は非破壊的です(イミュータブルなので)。
投稿2020/11/17 11:46
編集2020/11/17 11:49総合スコア35678
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。