抛出这个问题(在Python 2.7.5中)有一点错字:
def foo(): return 3
if foo > 8:
launch_the_nukes()
Run Code Online (Sandbox Code Playgroud)
当它,我不小心爆炸了月亮.
我的理解是,E > F相当于(E).__gt__(F)和表现良好的类(如内置)相当于(F).__lt__(E).
如果没有__lt__或__gt__运营商那么我认为Python使用__cmp__.
但是,这些方法都与工作function对象,而<与>运营商做的工作.引擎盖下发生了什么?
>>> foo > 9e9
True
>>> (foo).__gt__(9e9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute '__gt__'
>>> (9e9).__lt__(foo)
NotImplemented
Run Code Online (Sandbox Code Playgroud) 假设我想比较两个不同数据类型的变量:string和int.我在Python 2.7.3和Python 3.2.3中都测试了它,并且都没有抛出异常.比较的结果是False.在这种情况下,我可以使用不同的选项配置或运行Python以引发异常吗?
ks@ks-P35-DS3P:~$ python2
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>>
ks@ks-P35-DS3P:~$ python3
Python 3.2.3 (default, Apr 12 2012, 19:08:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>>
ks@ks-P35-DS3P:~$
Run Code Online (Sandbox Code Playgroud) 我在尝试比较时注意到了这一点:
if len(sys.argv) >= 2:
pass
Run Code Online (Sandbox Code Playgroud)
但我做到了这一点仍然是真的(花了我一些时间来找到这个bug.):
if sys.argv >= 2: # This is True!!!
pass
Run Code Online (Sandbox Code Playgroud)
以下是一些例子:
>>> {} > 2
True
>>> [] > 2
True
>>> () > 2
True
>>> set > 2
True
>>> str > 2
True
>>> enumerate > 2
True
>>> __builtins__ > 2
True
>>> class test:
... pass
...
>>> test
<class __main__.test at 0xb751417c>
>>> test > 2
True
Run Code Online (Sandbox Code Playgroud)
在python3.x中它会导致TypeError.
以下句子对我来说是一个混乱的原因(来自Guido在python.org上的教程):
"请注意,比较不同类型的对象是合法的.结果是确定性的但是随意的:类型按名称排序.因此,列表总是小于字符串,字符串总是小于元组,等等"一个元组等."
这意味着:
a=[90]
b=(1)
a<b
Run Code Online (Sandbox Code Playgroud)
结果应该是True.但事实并非如此!你可以帮助我吗?不是一个元组,等等."
另外,"结果是确定的但是随意的"是什么意思?
我无意中输入time.clock<()了Python 2.7解释器响应:True.以下代码举例说明了该行为:
>>> repr(time.clock)
'<built-in function clock>'
>>> time.clock<()
True
Run Code Online (Sandbox Code Playgroud)
此外:
>>> import sys
>>> sys.maxint < ()
True
>>> map(lambda _:0<_,((),[],{}))
[True, True, True]
Run Code Online (Sandbox Code Playgroud)
相反:
>>> 1<set(())
TypeError: can only compare to a set
Run Code Online (Sandbox Code Playgroud)
问题:除了为什么,是否存在空洞的实际意义或目的list,tuple或dict评估好像是否大于任何数字?
更新:
Viktor指出默认情况下会比较内存地址:
>>> map(lambda _:(id(0),'<',id(_)),((),[],{}, set([])))
[(31185488L, '<', 30769224L), (31185488L, '<', 277144584L), (31185488L, '<',
279477880L), (31185488L, '<', 278789256L)]
尽管看似顺序,但这是不正确的.
如果没有定义明确的比较运算符,Python 2将使用Numbers和Type-names进行比较,其中数字的优先级最低.
这并未暗示正在调用的内部方法.另见这个有用但不确定的SO线程:
在IPython 2.7.5 …
python ×5
comparison ×2
boolean ×1
collections ×1
exception ×1
logic ×1
python-2.7 ×1
types ×1