2

私の同僚の 1 人が (Python 2.7 で) 組み込みのmax関数を使用していて、奇妙な動作を発見しました。

誤って、キーワード引数key (のようにkey=lambda n: n) を使用して、パラメーターとして渡されたリストを事前に並べ替える代わりに、彼は次のようにしました。

 >>> max([1,2,3,3], lambda n : n)
[1, 2, 3, 3]

彼は、ドキュメントで次のように説明されていることをしていました。

2 つ以上の位置引数が指定されている場合、最大の位置引数が返されます。、だから今、私はこれがなぜ起こるのか興味があります:

>>> (lambda n:n) < []
True
>>> def hello():
...     pass
... 
>>> hello < []
True
>>> len(hello)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'function' has no len()

大したことではないことはわかっていますが、stackoverflowersのいずれかが内部でこれらの比較がどのように行われるかを説明できれば幸いです (または、その情報を見つけることができる方向に私を向けてくれます)。:-)

前もって感謝します!

4

2 に答える 2

7

Python 2 は、さまざまなタイプのオブジェクトをかなり恣意的に並べ替えます。内容が何であれ、リストを常にソート可能にするためにこれを行いました。比較結果がどちらの方向に向かうかは重要ではなく、どちらかが常に勝つということだけです。たまたま、C 実装は型名の比較にフォールバックします。lambdaの型名はfunctionで、前にソートされlistます。

Python 3 では、代わりにコードで例外が発生します。

>>> (lambda n: n) < []
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: function() < list()

お気づきのように、恣意的な比較をサポートすると、ほとんどの場合、解読が困難なバグが発生するためです。

于 2013-07-25T17:37:20.097 に答える
6

Python (2) のすべてを比較できますが、ご覧のとおり、かなり無意味なものもあります。

>>> (lambda n:n) < []
True

Python 3 はこれを解決し、代わりに例外を生成します。

于 2013-07-25T17:38:04.517 に答える