Python `print` 传递额外文本到 sys.stdout?

5 投票
3 回答
1772 浏览
提问于 2025-04-17 07:10

我可能遗漏了一些很简单的东西,但这让我在一个更大的项目(一个 c 扩展)上卡住了。

为什么这里的 print "Hello, World!" 会把 None 和一个多余的 \n 传给 sys.stdout 呢?

>>> import sys
>>> class StdOutHook:
...     def write(self, text):
...         sys.__stdout__.write("stdout hook received text: %s\n" % repr(text))
... 
>>> class StdErrHook:
...     def write(self, text):
...         sys.__stderr__.write("stderr hook received text: %s\n" % repr(text))
... 
>>> sys.stdout = StdOutHook()
>>> sys.stderr = StdErrHook()
>>> 
>>> def x():
...     print "Hello, World!"
... 
>>> 
>>> print x()
stdout hook received text: 'Hello, World!'
stdout hook received text: '\n'
stdout hook received text: 'None'
stdout hook received text: '\n'
>>> 

3 个回答

1
def x():
   print "Hello, World!"

这段代码会执行 print,然后返回 None。因为你写了 print x(),所以会多出一些空行,最后还会打印出 None :)

如果你想去掉多余的空行,可以把 print 改成直接写 x,像这样:

def x():
   sys.stdout.write("Hello, World!")
3

两件事:

首先,打印的时候默认会自动换行,除非你特别说明不想换行。如果你不想换行,可以加一个逗号:

print "Hello, World!",

其次,你打印的是函数 x() 的返回值,而这个返回值是 None。函数 f() 的意思和下面这个是一样的:

def x():
    print "Hello, World!"
    return None

所以 print x() 打印出来的是 None

8

print x() 会输出 x() 的返回值,而这个返回值默认是 None,也就是“什么都没有”。

你可以把 print "Hello world" 改成 return "Hello world",或者把 print x() 改成 x()

撰写回答