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

Chr*_*ard 0 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))
Run Code Online (Sandbox Code Playgroud)

这会产生输出:

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: ''
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢,

mgi*_*son 6

这条线:

for as_string in ' '.split(line):
Run Code Online (Sandbox Code Playgroud)

这里非常腥.您在' '分隔符上拆分字符串line,很可能返回列表[' '].请记住,字符串仅在(0个字符)时评估为False-y值.该字符串' '不为空(它有一个字符).

你可能想做类似的事情:

for as_string in line.split():
    ...
Run Code Online (Sandbox Code Playgroud)

它会line在连续的空格中分开.


Mar*_*ers 6

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

for as_string in line.split(' '):
Run Code Online (Sandbox Code Playgroud)

通过用line分隔符分割空格字符,你总是会最终得到[' '],而不是空字符串:

>>> ' '.split('10 20 30')
[' ']
Run Code Online (Sandbox Code Playgroud)

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

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

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

您可能想要甚至省略' '参数wen splitting并在可变宽度空白上拆分:

for as_string in line.split():
Run Code Online (Sandbox Code Playgroud)

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

>>> '  10          20\t30\n'.split()
['10', '20', '30']
Run Code Online (Sandbox Code Playgroud)

从文档:

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