期望ValueError:太多的值无法解包,但是得到TypeError:'bool'对象是不可迭代的

时间:2018-08-18 02:53:58

标签: python python-2.7

Python 2.7.10(默认值,2015年9月17日,03:50:35) linux2上的[GCC 4.4.7 20120313(Red Hat 4.4.7-11)]

<kendo-datepicker [(value)]="event.date" id="date" name="date" style="width: 100%;" (valueChange)="handleChange($event)"></kendo-datepicker>

<kendo-timepicker [(value)]="event.startTime" id="startTime" name="startTime" style="width: 100%;" (valueChange)="handleChange($event)"></kendo-timepicker>

<kendo-timepicker [(value)]="event.endTime" id="endTime" name="endTime" style="width: 100%;" (valueChange)="handleChange($event)"></kendo-timepicker>

vs

>>> def f():
...   return True
... 
>>> 
>>> a,b = f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bool' object is not iterable

为什么有区别?

2 个答案:

答案 0 :(得分:2)

这是因为bool对象是不可迭代的,即使bool对象是可迭代的,它也会执行与第二个示例相同的操作。

示例:

for i in True:
    print(i)

引发和错误:

Traceback (most recent call last):
  File "C:\Users\rep\Desktop\code\so.py", line 3517, in <module>
    for i in True:
TypeError: 'bool' object is not iterable

但是:

for i in 'True':
    print(i)

返回:

T
r
u
e

还有:

解决他们的问题:

a,b = f(),f()

正如@ggorlen所说,做:

def f(): return "Tr"

然后:

a, b = f()

答案 1 :(得分:0)

TypeError表示“这种对象永远不能在这种情况下使用”,而ValueError表示“这种对象可以在这种情况下使用,但是这种对象有错误的值”。在这种情况下,不能重复bool(永远(按值顺序处理bool值意味着什么?),所以它是TypeError

但是,可以迭代

str str是代表字符串中每个字符的长度为1 str的序列,因此'True'迭代为'T''r''u''e';总共有四个值,但是当您需要填充两个变量时,只有长度为2的str有效,而所有其他str都有无效值,因此ValueError。如果您提供了更多要分配的名称,例如a, b, c, d = f(),或者字符串较短,例如"Tr",该代码可以正常运行。