質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1118閲覧

破壊 / 非破壊について

python365

総合スコア31

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/17 11:40

内容

破壊、非破壊の定義がいまいち分かりません。
元のリストを破壊するか否かの区分だと認識していたのですが、以下の見る限

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/11/17 11:42

で、変わってるからそれが何でしょうか ちと質問の内容がわかりません
guest

回答3

0

(1,2,3)等はリストじゃなくてタプルです。
タブルは変更できないので、破壊はあり得ません。

あと、「オブジェクトの変更」と「代入し直し」の区別が付いていますか?

投稿2020/11/17 11:48

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

quickquip

総合スコア11235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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
LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問