为什么写入控制台中的stdout会附加在Python 3中写入的字符数?

cri*_*top 7 python stdout sys python-3.x

sys.stdout.write()当我注意到这会产生一些奇怪的输出时,我只是在Python控制台中玩.

对于每次write()调用,分别写入传递给函数的字符数将附加到控制台的输出中.

>>> sys.stdout.write('foo bar') 例如,foo bar7打印出来的结果 .

即使传递空字符串也会产生输出0.

这实际上只发生在Python控制台中,但在执行具有相同语句的文件时却不会发生.更有趣的是,它只适用于Python 3,但不适用于Python 2.

虽然这对我来说不是一个问题,因为它只发生在控制台中,但我真的很想知道为什么它会像这样.

我的Python版本在Ubuntu 15.10下是3.5.1.

Noc*_*tua 9

除了写出给定的字符串,write还将返回字符数(实际上,字节,尝试sys.stdout.write('?llö'))当python控制台将每个表达式的返回值打印到stdout时,返回值将附加到实际打印值.

因为write不附加任何换行符,所以它看起来像是相同的字符串.

您可以使用包含以下内容的脚本验证这一点:

#!/usr/bin/python
import sys

ret = sys.stdout.write("Greetings, human!\n")
print("return value: <{}>".format(ret))
Run Code Online (Sandbox Code Playgroud)

这个脚本应该在执行输出时:

Greetings, human!
return value: <18>
Run Code Online (Sandbox Code Playgroud)

此处的文档中提到了此行为.

  • 只是添加,它计算Unicode字符`sys.stdout.write('へllö')`返回"へllö4" (2认同)
  • @critop这是因为对IO进行了2到3的大修。“ stdout”的类型是“文件”,声明为[write](https://docs.python.org/2/library/stdtypes.html# file.write)为没有返回值。新类型是`TextIOWrapper`,它的基础之一(`TextIOBase`)声明[write](https://docs.python.org/3/library/io.html#io.TextIOBase.write)返回写入的字符数。 (2认同)