40465


rubyは破壊か非破壊か区別する記号があるみたいですが、他の言語は思わぬ結果になったらその都度対処しますか？

### python

[code]

    a = [3,1,6,7]
    print(a.sort())# --- None --- ???
    
[/code]

* * *
[code]

    a = [1,3,5,2,4]
    a.sort()
    print(a)# [1,2,3,4,5]
    
[/code]

* * *

### Ruby

[code]

    ary = ["taguti", "sugimoto", "fkoji"]
    p ary.sort# --- ["fkoji", "sugimoto", "taguti"]
    
[/code]


CC BY-SA 3.0
2017-12-21T15:53:45.303
40461
2017-12-22T01:31:03.027
2020-06-17T08:14:45.997
-1
26076
question
python ruby
破壊は常に意識するものですか？それとも都度対処しますか？


言語として、データを破壊しないかどうかを強制する仕組みがある場合は、それを利用して判断できます。

例:

  * Haskell: すべての値は基本的に Immutable
  * C++: const 修飾子

そういうものがない場合(ruby/python)には、それは(標準)ライブラリがどうそれを実装するかによります。ライブラリは、基本的には、そこまで利用者がおどろくようなことはしないように設計するのが普通なので、「こう動くだろう」と予測したとおりに大体動いてくれるはず、と期待することはできますが、最終的には、ドキュメントに書いてあることを読むしかありません。

ひとつ、今回の話題に挙がっている sort については、少し特筆するべきことがあるかもしれないです。sort のアルゴリズムには、有名な quick
sort があります。そしてこれは破壊的なアルゴリズムです。 python
の配列は、メモリに連続配列されるデータとしての配列的な側面が強い感じがする設計になっているので、「配列に実装された sort
メソッド」を考えると、なので、素直に quick sort, おそらく破壊的、と推測するのはそこまでおかしくないと感じます。

ruby の配列は、配列的ランダムアクセスはサポートするのだけれども、 list っぽい操作も集合っぽい操作もできる、すてきな 0
から添字されるデータ集合、という性質のようなものがある気がします。なので、それの上で定義される無印 sort メソッドは、少なくとも python
よりは、破壊的ではないことを「期待できる」気がします。


CC BY-SA 3.0
2017-12-21T18:02:21.937
40465
2017-12-21T18:02:21.937
754
40461
answer


Pythonの標準ライブラリの範囲でいえば、破壊的なメソッドは値を返さない、という暗黙的な約束でデザインされています（されているようです）。

<http://docs.python.jp/3/library/stdtypes.html#list.sort> に

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

とあるように「ドキュメントに書いあること」ですね。

* * *

> sort() メソッドは安定していることが保証されています。

とも書いてありますからクイックソートではありえないです。やっぱり、まずドキュメントをあたるべきということです。


CC BY-SA 3.0
2017-12-22T01:31:03.027
40471
2017-12-22T01:31:03.027
12274
40461
answer