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

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

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

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

Q&A

解決済

3回答

1107閲覧

Pythonのlistメソッドを連続させるとエラーになる理由

MagMag

総合スコア80

Python 3.x

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

0グッド

0クリップ

投稿2020/03/16 00:35

以下の場合のように、メソッドを連続させるとエラーになるのか、その理由を教えていただけないでしょうか?

スクリプト作成自体に支障はないのですが、例えばPandasだとメソッドを連続させることをよく行っているので(df.assign(...).pipe(...)など)、以下の操作ができないようになっている理由が理解できないです。

おそらく、l1.extend(l2)が返り値としてNoneを返しているからと思いますが、なぜそういう設計になっているのでしょうか?(仕様と言われればそれまでですが)

# 問題ない方法 l1 = [1,2,3,4,5] l2 = [6,7,8] l1.extend(l2) l1.remove(8) print(l1) # [1, 2, 3, 4, 5, 6, 7] # 問題が発生する方法 l1 = [1,2,3,4,5] l2 = [6,7,8] l1.extend(l2).remove(8) # AttributeError: 'NoneType' object has no attribute 'remove' print(l1.extend(l2)) # None

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答3

0

他の方の回答の通りで、「仕様だから」ということなのですが、どうしてこのような仕様になっているのかというと、ソフトウェア/言語を構築するにあたっての思想、

* Command-Query Separation (CQS)

に沿って作られているからということになります。 日本語だったら、

* コマンド/クエリ分離の法則

とかでしょうか。

このワードで検索してみるといろいろ情報が得られます。

投稿2020/03/16 04:07

編集2020/03/16 04:09
TakaiY

総合スコア12799

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

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

MagMag

2020/03/16 04:57

なるほど、そういう設計思想があるんですね。ありがとうございました。
guest

0

ベストアンサー

FAQ なぜ list.sort() はソートされたリストを返さないのですか?

https://docs.python.org/ja/3/faq/design.html#why-doesn-t-list-sort-return-the-sorted-list

そこで、 list.sort() はインプレースにリストをソートします。このことを忘れないため、この関数はソートされたリストを返しません。

に基本思想が見えます。


ほかに

https://docs.python.org/ja/3/library/stdtypes.html#mutable-sequence-types

reverse() メソッドは、大きなシーケンスを反転するときの容量の節約のため、シーケンスをインプレースに変化させます。副作用としてこの演算が行われることをユーザに気づかせるために、これは反転したシーケンスを返しません。

あたりにも同様の記載があってインプレースに変更するメソッドは基本的に値を返さない方針だとうかがえます。

投稿2020/03/16 00:47

編集2020/03/16 00:57
quickquip

総合スコア11055

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

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

MagMag

2020/03/16 04:58

ありがとうございました!
guest

0

quiquiさんの解答の通りですね。

Pythonに限らず、他の言語でも

  • 元のリストに直接変更を加えるメソッドには戻り値がない
  • 元のリストに変更を加えないメソッドは、元のリストのコピーに変更を加え、戻り値として返す。したがってメソッドチェーンが可能になる

という仕様になっているのが一般的です。

投稿2020/03/16 00:56

編集2020/03/16 00:56
takeaship

総合スコア129

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

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

MagMag

2020/03/16 04:57

よくわかりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問