为什么''在Python中显然被评为True

时间:2013-05-23 17:57:26

标签: python

我有:

raw_matrix.append([])
for as_string in ' '.split(line):
    if as_string:
        print('as_string: #' + as_string + '#')
        raw_matrix[-1].append(int(as_string))

这会产生输出:

as_string: # #
Traceback (most recent call last):
  File "product_of_four", line 27, in <module>
    raw_matrix[-1].append(int(as_string))
ValueError: invalid literal for int() with base 10: ''

raw_matrix是一个20x20的两位数(十进制)数字行,用空格分隔。

如果我正确读取这个,as_string正在评估''或'',并且我得到一个例外,as_string的副作用是不可解析的,因为它不包含int()的副作用 - 可解析的数字字符串。

如何更改内容以便Python 2.x(3.x)解析一串两位数的整数,而不是尝试将不可解析的字符串解析为整数?

谢谢,

4 个答案:

答案 0 :(得分:6)

该行:

for as_string in ' '.split(line):

在这里非常腥。您要在分隔符' '上拆分字符串line,最有可能返回列表[' ']。请记住,字符串仅在为空(0个字符)时才会计算为False-y值。字符串' '不为空(它有一个字符)。

你可能想做类似的事情:

for as_string in line.split():
    ...

将在连续空格的运行中拆分line

答案 1 :(得分:6)

你正在使用错误的方式分开;拆分线,而不是' '空格:

for as_string in line.split(' '):

通过line分隔符拆分空格字符,你总是会以[' ']结束,而不是空字符串:

>>> ' '.split('10 20 30')
[' ']

(异常是空分隔符,不允许,并且在' '上分割,这会给你两个空字符串)。结果中唯一的元素' '是一个非空字符串,所以在布尔上下文中为True。

对于错误消息,int()忽略前导和尾随空格。剩下的是一个空字符串:

>>> int(' ')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''

你可能想要省略' '参数wen splitting,只是在可变宽度空格上拆分:

for as_string in line.split():

将第一个参数设置为默认值None。使用str.split()也会忽略任何前导和尾随空格,在从文件中读取行时总是很方便,那些将包含换行符:

>>> '  10          20\t30\n'.split()
['10', '20', '30']

来自文档:

  

如果未指定 sep None,则应用不同的拆分算法:连续空格的运行被视为单个分隔符,结果将不包含空字符串如果字符串具有前导或尾随空格,则为开始或结束。因此,将空字符串或仅包含空格的字符串与None分隔符分开将返回[]

答案 2 :(得分:3)

您的split语句构造错误;它应该是line.split(' ')。它写的方式,你试图通过line的任何内容来划分单个空格,这显然只会返回空间。这不能被评估为整数。

答案 3 :(得分:2)

' '计算结果为True,因为它不是空字符串(那里有空格)。

您的代码存在的问题是for as_string in ' '.split(line)实际上应该是for as_string in ' '.split(line)