print,默认情况下,打印到sys.stdout
并在内部缓冲要打印的输出。
输出是否被缓冲通常由文件决定,但是如果flush
关键字参数为 true,流被强制刷新。
版本 3.3 中更改:添加了flush
关键字参数。
Quoting sys.stdout的文档,
交互时,标准流是行缓冲的。否则,它们像常规文本文件一样被块缓冲。
所以,在你的情况下,你需要明确地刷新,就像这样
import time
for i in range(10):
print(i, flush=True)
time.sleep(.5)
好吧,关于这个缓冲有很多混乱。让我尽可能解释一下。
首先,如果您在终端中尝试这个程序,他们会这样做行缓冲(这基本上意味着,每当遇到换行符时,将缓冲的数据发送到stdout
), 默认情况下。所以,你可以在Python 2.7中重现这个问题,就像这样
>>> import time
>>> for i in range(10):
... print i,
... time.sleep(.5)
...
在 Python 3.x 中,
>>> for i in range(10):
... print(i, end='')
... time.sleep(.5)
We pass end=''
因为,默认的end
值为\n
,根据print的文档,
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
由于默认end
打破行缓冲,数据将被发送到stdout
立即地。
重现此问题的另一种方法是将 OP 给出的实际程序存储在文件中并使用 Python 3.x 解释器执行,您将看到stdout
内部缓冲数据并等待程序完成打印。