0

我们知道如何bool()作用于各种 python 对象,例如str, int, list.

这是一个关于反向的问题。

您可以将 bool 转换为 int 为

>>> int(True)
1
>>> int(False)
0

我认为这有点道理,但我们得到了字符串

>>> str(False)
'False'
>>> str(True)
'True'

False我不明白,因为首先它似乎暗示了and之间的某种关系'False',这似乎只在代码级别相关。如果要以这种方式处理代码中编写的内容,那么它是如何工作的...

>>> str(not True)
'False'

其次,这并不明显是为了一致性,因为

>>> bool(str(False))
True

我的问题是......有没有理由允许我们boolstr这种方式投射?list例如不允许它...

>>> list()
[]
>>> bool()
False
>>> bool(list())
False
>>> list(bool())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bool' object is not iterable
4

4 回答 4

8

用于调试。如果你不能把一个东西转换成一个字符串,你就不能打印它。如果要打印用于调试的数据结构,则需要能够将每个元素转换为字符串。str就是记录要做的事情......

返回一个字符串,其中包含一个对象的可很好打印的表示。


如果要以这种方式处理代码中编写的内容,那么它是如何工作的...

>>> str(not True)
'False'

not True解析到False然后传递给str. 它类似于 withfoo(1 + 1) foo接收 2。


其次,这并不明显是为了一致性,因为

>>> bool(str(False))
True

铸造不保证往返。例子是int(float(2.34))int(unichr(97))

str将某些内容转换为人类的字符串(这是做什么的)和将某些内容转换为必须往返的编组字符串之间存在重要区别。有专门的包,如编组marshaljson编组。

但是在 Python 中bool,强制转换是错误的思考方式。str如上所述,str返回可打印的表示,而不是机器可读的表示。bool是为了问“这个表达的真实性是什么”?从文档...

x 使用标准真值测试程序进行转换。

"True"并且"False"都是真的。如果他们为此添加一个特殊情况,bool那将是非常不一致的。

于 2018-07-22T00:55:59.123 回答
3

str()并且bool()不是“强制转换”,它们是构造函数(类型对象)。调用str(x)任何值x将构造一个新str对象,其值已从 (以某种方式)初始化x。两个对象之间没有隐含的关系;str(x)可以返回任何东西,只要它是一个str对象。

基本上:不要再认为 Python 像您可能习惯的其他语言一样具有“强制转换”。构造函数只是另一种可调用对象,一般规则是每种类型都对传递给构造函数的参数做一些合理的事情。在 的情况下str(),它委托给__str__特殊方法(如果存在),这意味着bool对象返回字符串'True''False'因为这是bool类型决定做的事情。

于 2018-07-22T01:04:48.733 回答
1

str(True)那么,存在有什么问题'True'?这是相当预期的。

现在,如果将布尔值转换为整数,很明显结果必须是数字。

并且,自然地,not True评估为False。即str(False),则:'False'

关于该bool()函数,它应该返回True任何非空、零、None 或 False 的值。

所以任何不''适合这个的字符串都会返回True。查看更多:https ://docs.python.org/3/library/stdtypes.html#truth

于 2018-07-22T00:55:36.940 回答
-1

False在 Python中考虑的事情非常有限:

  • 没有任何
  • 错误的
  • 任何数字类型的零,例如 0、0L、0.0、0j。
  • 任何空序列,例如,''、()、[]。
  • 任何空映射,例如 {}。
  • 用户定义类的实例,如果该类定义了非零()或len()方法,当该方法返回整数零或布尔值 False

因此,如果您这样做bool(something),它将仅返回False这些项目。Python 中的其他所有内容都True包括虚假事物的字符串表示:'0' 'False'等,'None'因为字符串本身是True.

于 2018-07-22T01:26:40.677 回答