如果您检查打印语句的字节码,它看起来像这样:
>>> def f():
... print "Worker"
...
>>> dis.dis(f)
2 0 LOAD_CONST 1 ('Worker')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
事实上,打印多个项目会产生多个 PRINT_ITEM 字节码:
>>> def g():
... print "Worker", "Hello"
...
>>> dis.dis(g)
2 0 LOAD_CONST 1 ('Worker')
3 PRINT_ITEM
4 LOAD_CONST 2 ('Hello')
7 PRINT_ITEM
8 PRINT_NEWLINE
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
为了使多个项目之间有一个空格,文件对象有一个名为 softspace 的标志,指示是否应该在下一个项目之前输出一个空格。PRINT_ITEM 和 PRINT_NEWLINE 的代码大致如下所示:
def PRINT_ITEM(f, item):
if f.softspace:
f.write(' ')
f.write(str(item))
f.softspace = True
def PRINT_NEWLINE(f):
f.write('\n')
f.softspace = False
当您一次从多个线程写入标准输出时,这些操作会以随机方式交错。因此,您可以连续拥有两个 PRINT_ITEM,而不是交替使用 PRINT_ITEM 和 PRINT_NEWLINE。如果发生这种情况,您的输出中将有额外的空格,因为两个 PRINT_ITEM 和 softspace 标志会产生额外的空格。