【问题标题】:How does print handle the comma exactly?print 如何准确处理逗号?
【发布时间】:2017-05-19 08:47:07
【问题描述】:

我本来以为:

print "text",

差不多
sys.stdout.write("text" + " ")

但后来我尝试了以下操作:

print '(',
sys.stdout.write("text")
print ')'

预期输出:

( text)

(text )  # if the space is added by the next print statement

我得到了什么:

(text)  # no space at all

谁能解释这种行为?我只是好奇

【问题讨论】:

    标签: python python-2.7 printing python-internals


    【解决方案1】:

    打印包括将项目转换为字符串,然后将它们写入文件对象(默认为sys.stdout)。在 Python 2 中,print 语句在您写入的文件对象上保留一个标志,称为 软空间标志。请参阅 Python C API 中的 file.softspace attributePyFile_SoftSpace() function

    此标志用于跟踪何时写入空格。打印在内部实现为一系列PRINT_ opcodes,并管理标志:

    • 打印一个项目(使用PRINT_ITEMPRINT_ITEM_TO)首先检查标志,如果设置了会写入一个空格,写出项目后会再次设置标志
    • 写一个换行符是一个单独的操作码(PRINT_NEWLINEPRINT_NEWLINE_TO),并且在不写空格的情况下清除标志。

    但是,直接写入文件对象,就像您对 sys.stdout.write() 所做的那样,会清除该标志(在执行写入之前):

    >>> import sys
    >>> if True:
    ...     sys.stdout.softspace = 1
    ...     sys.stdout.write('{}\n'.format(sys.stdout.softspace))
    ...     sys.stdout.softspace
    ...
    1
    0
    

    (我使用了if 块来防止解释器循环在其间写入提示)。

    这就是您的示例中发生的情况:

    • ( 被写入 sys.stdout 并且 sys.stdout.softspace 被设置。
    • sys.stdout.write('text') 清除标志再次写出text
    • 在写入) 之前,PRINT_ITEM 检查标志,发现它没有设置,然后写入)。再次设置标志。
    • PRINT_NEWLINE 写入换行符,再次清除标志。

    所有这些都是为了跟踪一个简单的特性而做的大量工作,这也是 Python 3 迁移到 函数 进行打印的原因之一。见PEP 3105

    【讨论】:

    • 我也在控制台中尝试过,我使用if True: 一次执行所有命令;)感谢您的精彩解释!
    • @Aemyl:我刚刚偷走了if True 的想法;-)
    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 2011-09-26
    • 2011-01-24
    • 2021-04-14
    • 2013-06-10
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多