在Python中将布尔值用作整数是否合适?

72 投票
7 回答
11292 浏览
提问于 2025-04-16 00:48

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 个回答

41

当然:

def bool_to_str(value):
    "value should be a bool"
    return 'Yes' if value else 'No'

这样更容易读懂。

158

我和Alex有同样的看法。False==0True==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时也能正确处理。

176

我可能是个异类,因为大家都在反对使用 False == 0True == 1 这个事实,但我认为用这个事实来简化代码是完全可以的。

历史上,逻辑上的真和假通常用 0 表示假,用 1 表示真。在 Python 2.2 的发展过程中,Guido 发现很多模块都开始用 false = 0; true = 1 这样的赋值,这导致了很多重复的代码和不必要的变化(因为大家对 true 和 false 的大小写使用不一致,有的全大写,有的全小写,还有的首字母大写),所以他引入了 bool 这个 int 的子类,以及它的 TrueFalse 常量。

当时有很多人反对,因为我们担心新类型和常量会让 Python 新手限制语言的功能,但 Guido 坚持认为我们太悲观了:没有人会这么糟糕地理解 Python,以至于不使用 FalseTrue 作为列表索引,或者在求和时使用它们,或者在其他清晰有用的地方使用。

这个讨论的回答证明了我们的担忧是对的:正如我们所担心的,这个类型和常量的角色被完全误解了,人们确实在避免使用这些自然的 Python 结构,甚至还劝别人也不要用,而是去做一些无用的变形。

面对这种误解的潮流,我呼吁大家 用 Python 就要像用 Python不要试图把它强行套入其他语言的模式,因为那些语言的功能和风格是完全不同的。在 Python 中,True 和 False 99.9% 就像 1 和 0,唯一的区别在于它们的 str(...)(以及 repr(...))形式——对于除了字符串化以外的所有操作,随便用它们就行,不用纠结。这适用于索引、算术、位运算等等。

撰写回答