debug和run给出不同的输出python

时间:2017-03-20 22:14:49

标签: python debugging

此程序计算较大字符串中字符串重叠出现次数。

输入:

  • 更大的字符串(var name:search_space)<< ABABABA

  • 较小的字符串(var name:search_string)<< ABA

使用Pycharm 2016.3中的“调试代码”进行回答:3

使用Pycharm 2016.3中的“运行代码”进行回答:7

预期答案:3

我的代码:

import sys

def count_substring(search_space, search_string):
    search_space = search_space.lower()
    search_string = search_string.lower()

    if search_space:
        search_space = search_space.split('\n')[0]
    if search_string:
        search_string = search_string.split('\n')[0]
    lower = 0
    upper = len(search_string)
    curr = ' '
    count = 0
    for curr in search_space:
        selected = search_space[lower:upper]
        if search_string == selected:
            count += 1
        lower += 1
        upper += 1
        if upper > len(search_space):
            break
    return count

if __name__ == '__main__':
    s = sys.stdin.read()
    t = sys.stdin.read()
    occurance_count = count_substring(s, t)
    sys.stdout.write(str(occurance_count))

修改了代码以帮助阐明错误:

for idx, curr in enumerate(search_space):
    print(idx, curr)
    print(count)
    selected = search_space[lower:upper]

使用'Debug Code'输出:(按预期工作)

>? abababa <ENTER>
>? aba <ENTER>
0 a
0
1 b
1
2 a
1
3 b
2
4 a
2
3

使用“运行代码”输出:

abababa
aba
^D  
0 a
0
1 b
1
2 a
2
3 b
3
4 a
4
5 b
5
6 a
6
7

注意: 按下^ D即Ctrl + D,因为在运行期间按ENTER键会插入换行符。 Ctrl + D是我设法让剩下的代码运行的唯一方法。但即使没有CTRL + D,当代码的远程测试完成时,差异仍然存在(这是自我导向的非证书课程的一部分)

注意:我必须使用标准输入和输出进行此练习。

在我看来,使用for curr in search_space:使循环在search_space的整个长度内迭代,因此比它应该的次数多。

为什么Break命令不起作用?

我的问题:

  1. 为什么会这样?
  2. &安培;我会阅读哪些概念来理解和预见此类事件?
  3. 为什么调试和运行模式存在差异?
  4. 如何在未来的代码中预见并防止此错误?
  5. 有比Ctrl + D更好的方法吗?这个粗略的技巧在Terminal或IDLE中不起作用。

2 个答案:

答案 0 :(得分:0)

Elmar Peise评论说:
你从stdin读取了两次:sys.stdin.read()。此方法从该流中读取直到其结束(而不是在&#34;运行&#34;示例中的行尾)。它应该只被调用一次,之后你不应该触摸stdin。

Qubit写道:
我用readline()替换了read(),结果一切正常 如果有人有更多有用的金块要分享,请这样做并感谢你,但我的特殊困境现在已经解决,所以将此标记为答案。
谢谢Elmar!

答案 1 :(得分:0)

代码从stdinsys.stdin.read()读取两次。此方法从该流读取直到其结束(不是“运行”示例中的行尾)。它应该只调用一次,之后你不应该触摸stdin

如果您想逐行阅读输入,请使用sys.stdin.readline()