在Python中将潜在的布尔值转换为布尔值,有什么缺点吗?

时间:2018-09-20 09:15:49

标签: python boolean

在我的python代码中,我将一些bool()强制转换为我知道可能已经为布尔值的变量。这有什么缺点吗? (性能等)

这是我正在使用的功能的基本克隆。

import re
pattern= "[A-Z]\w[\s]+:"
other_cond= "needs_to_be_in_the_text"
def my_func(to_check: str) -> bool:
    res = re.search(pattern, to_check)
    res2 = other_cond in to_check
    return bool(res), bool(res2) # res2 either None or True
# I need boolean returns because later in my code I add all these  
# returned values to a list and use min(my_list) on it. to see if
# there's any false value in there. min() on list with None values causes exception

3 个答案:

答案 0 :(得分:2)

通常不需要强制转换为bool(),您可以使用更惯用的if:if not:语法,但是如果有必要并且您想避免使用{ {1}},一个相对昂贵的类型构造函数,然后使用更轻量的方法,例如专门功能的bool()(更多信息here)。

Ipython中Python 3.6的时间说明operator.truth相对较慢(不过,这通常是不必要的微优化):

bool()

答案 1 :(得分:1)

取决于“几个”是什么,但通常不是。

当然,呼叫bool比不呼叫bool慢,但这不太可能成为您的瓶颈。


从理论上讲,将变量强制转换为bool可以触发大对象的垃圾回收,例如:

x = list(range(100000))
x = bool(x)
if x:
    foo()

是否有第二行可能会影响if主体的调用时间:强制转换时,原始列表超出范围并收集垃圾,不强制转换时,原始列表保留在内存中

我认为这些都是极端情况。

答案 2 :(得分:1)

不看示例代码就很难注释,但是强制转换为bool可能会损害代码的可读性。例如,如果语句隐式检查语句的真实性,那么添加bool不会给您任何帮助。

a = [1,2,3]

if a:
    pass

vs。用布尔包起来,这意味着要阅读更多。

if bool(a):
    pass

如果您要分配新变量,这将意味着更多事情需要跟踪,并且可能会引入错误,导致强制转换变量和原始变量不同步。

 a = [1,2,3]
 a_bool = bool(a)

 if a_bool:
      pass # will hit

 a = []

 if a_bool:
     pass # will still get here, even though you've updated a

如果您不进行投射,则没有什么可跟踪的:

a = [1,2,3]
if a:
   pass # will get here

a = []

if a:
    pass  # won't get here.
变量的

真实性在Python中通常被利用,并且使代码更具可读性。花时间习惯如何工作比将内容包装在bool中更好。