为什么下面的部分表现得像它的表现?
>>> '10' > 100
True
>>> 100 < '10'
True
不应该引发异常吗?
答案 0 :(得分:6)
CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
所以它只是在CPython('int' < 'str'
)中发生的事情,但不能保证在其他实现中发生。
实际上,python3中已删除此行为:
>>> '10' > 100
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
>>> 100 < '10'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
答案 1 :(得分:1)
来自manual:
CPython implementation detail: Objects of different types except numbers are
ordered by their type names; objects of the same types that don’t
support proper comparison are ordered by their address.
因此,如果你比较这两种类型:int / string
你有一个词典顺序bye元素的类型
答案 2 :(得分:0)
调用不同的运算符,在某一点调用__gt__
,在另一个运算符调用__lt__
检查一下:
class t(int):
def __gt__(self, other):
print 'here', v
return v
class t2(str):
def __lt__(self, other):
v = super(t2, self).__lt__(other)
print 'ohere', v
return v
if __name__ == '__main__':
a = t('10')
b = t2(100)
a > b
b < a
答案 3 :(得分:-1)
因为Python为数字实现了隐式类型转换,所以它们可以打印成字符串而不进行显式转换。
在与字符串1000
进行比较时,Python正在将"1000"
转换为字符串"10"
。根据Python解释器,"1000"
确实大于“10”。
这就是为什么:"I've got %s bananas" % 5000
有效的原因,与C或其他没有隐式类型转换的语言不同,我没有必要printf("I've got %i bananas", 5000);
答案 4 :(得分:-1)
我不是百分百肯定,但这里可能会发生一些内部类型转换。它可能正在进行所谓的词典比较,其中ASCII中的'1'大于1(第一个数字),依此类推。