在Python中将布尔值用作整数是否合适?
False
相当于 0
,而 True
相当于 1
,所以我们可以这样做:
def bool_to_str(value):
"""value should be a bool"""
return ['No', 'Yes'][value]
bool_to_str(True)
注意,虽然 value 是 bool
类型,但它却被当作 int
类型来使用。
这种用法算不算是 Python 风格,还是应该避免呢?
7 个回答
当然:
def bool_to_str(value):
"value should be a bool"
return 'Yes' if value else 'No'
这样更容易读懂。
我和Alex有同样的看法。False==0
和 True==1
是对的,这没什么问题。
不过,在Python 2.5及以后的版本中,我会用Python的条件表达式来回答这个特定的问题:
def bool_to_str(value):
return 'Yes' if value else 'No'
这样就不要求传入的参数一定是布尔值——就像 if x: ...
可以接受任何类型的 x
一样,bool_to_str()
函数在接收到None、字符串、列表或3.14时也能正确处理。
我可能是个异类,因为大家都在反对使用 False == 0
和 True == 1
这个事实,但我认为用这个事实来简化代码是完全可以的。
历史上,逻辑上的真和假通常用 0
表示假,用 1
表示真。在 Python 2.2 的发展过程中,Guido 发现很多模块都开始用 false = 0; true = 1
这样的赋值,这导致了很多重复的代码和不必要的变化(因为大家对 true 和 false 的大小写使用不一致,有的全大写,有的全小写,还有的首字母大写),所以他引入了 bool
这个 int
的子类,以及它的 True
和 False
常量。
当时有很多人反对,因为我们担心新类型和常量会让 Python 新手限制语言的功能,但 Guido 坚持认为我们太悲观了:没有人会这么糟糕地理解 Python,以至于不使用 False
和 True
作为列表索引,或者在求和时使用它们,或者在其他清晰有用的地方使用。
这个讨论的回答证明了我们的担忧是对的:正如我们所担心的,这个类型和常量的角色被完全误解了,人们确实在避免使用这些自然的 Python 结构,甚至还劝别人也不要用,而是去做一些无用的变形。
面对这种误解的潮流,我呼吁大家 用 Python 就要像用 Python,不要试图把它强行套入其他语言的模式,因为那些语言的功能和风格是完全不同的。在 Python 中,True 和 False 99.9% 就像 1 和 0,唯一的区别在于它们的 str(...)
(以及 repr(...)
)形式——对于除了字符串化以外的所有操作,随便用它们就行,不用纠结。这适用于索引、算术、位运算等等。