此代码:
import time
for i in range(10):
print(i)
time.sleep(.5)
使我的电脑挂起5秒钟,然后打印0-9,而不是每半秒打印一个数字。我做错了吗?
答案 0 :(得分:14)
print
打印到sys.stdout
并在内部缓冲要打印的输出。
输出是否缓冲通常由文件确定,但如果
flush
关键字参数为true,则强制刷新流。版本3.3中已更改:添加了
flush
关键字参数。
交互式时,标准流是行缓冲的。否则,它们像常规文本文件一样进行块缓冲。
因此,在您的情况下,您需要显式刷新,如此
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)
我们传递end=''
因为默认end
值为\n
,根据print
's documentation,
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
由于默认end
会破坏线路缓冲,因此数据会立即发送到stdout
。
重现此问题的另一种方法是将OP给出的实际程序存储在一个文件中并使用Python 3.x解释器执行,您将看到stdout
在内部缓冲数据并等待程序完成打印。
答案 1 :(得分:0)
试试这个:
for i in range(10):
sys.stdout.write('\r' + str(i))
time.sleep(.5)
这里'/r'
是回车符,它将光标再次放在第一位。