15

そこに至った思考過程に興味があります。比較的初心者の私にとっては、リスト処理の「連鎖」を防ぐため、邪魔に思えます(例:)mylist.reverse().append('a string')[:someLimit]。「The Powers That Be」は、リストの理解がより優れたパラダイムであると判断したため (有効な意見)、他の方法を奨励したくなかったのかもしれません。代替手段が存在します。

私は文句を言っていないことに注意してください (確かに合理的な理由があると確信しています。私はそれが何であるかに興味があるだけです!)、解決策を探しているのでもありません (ここのコメントは非常に有益でした) - いくつかのコンテキストを探しているだけです。言語の設計プロセスをより深く理解する。

4

3 に答える 3

23

Python の一般的な設計原則は、オブジェクトをその場で変更して を返す関数ですNone。それが私が選択した設計上の選択だったかどうかはわかりませんが、基本的には、新しいオブジェクトが返されないことを強調するためです。

(GvR (私たちの Python BDFL) は、ここで設計の選択を述べています: http://mail.python.org/pipermail/python-dev/2003-October/038855.html )

于 2012-06-26T10:44:30.997 に答える
11

開発者を代弁することはできませんが、この動作は非常に直感的です。

メソッドが元のオブジェクトで機能し、その場で変更した場合、新しい情報がないため、何も返されません。明らかに、(変更された) オブジェクトへの参照が既にあるのに、なぜそれを再度返すのでしょうか?

ただし、メソッドまたは関数が新しいオブジェクトを作成する場合は、もちろんそれを返す必要があります。

したがってl.reverse()、何も返されません (リストは逆になっていますが、identfierlはまだそのリストを指しているreversed(l)ため)、変更されていない古いリストを指しているため、新しく生成されたリストを返す必要がありlます。

編集:別の回答から、この原則がCommand-Query Separationと呼ばれることを知りました。

于 2012-06-26T10:40:04.930 に答える
4

署名自体が、関数が新しいリストを返すのではなく、リストを変更することを明確にしていると主張することができます。関数がリストを返す場合、その動作はそれほど明白ではありません。

于 2012-06-26T10:39:03.150 に答える