Python print如何准确地处理逗号?

Python print如何准确地处理逗号?,python,python-2.7,printing,python-internals,Python,Python 2.7,Printing,Python Internals,我原本以为: print "text", 将与 sys.stdout.write("text" + " ") 但后来我尝试了以下几点: print '(', sys.stdout.write("text") print ')' 预期产出: ( text) 或 我得到的是: (text) # no space at all 有人能解释这种行为吗?我只是好奇打印包括将项目转换为字符串,然后将它们写入文件对象(默认情况下是sys.stdout)。在Python 2中,print语句在写入的

我原本以为:

print "text",
将与

sys.stdout.write("text" + " ")
但后来我尝试了以下几点:

print '(',
sys.stdout.write("text")
print ')'
预期产出:

( text)

我得到的是:

(text)  # no space at all

有人能解释这种行为吗?我只是好奇

打印包括将项目转换为字符串,然后将它们写入文件对象(默认情况下是
sys.stdout
)。在Python 2中,
print
语句在写入的文件对象上保留一个标记,称为软空间标记。请参见Python C API中的和

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

  • 打印项目(使用
    PRINT_item
    PRINT_item_TO
    )首先检查标志,如果设置了标志,则会写入空格,在写入项目后,会再次设置标志
  • 写入换行是一个单独的操作码(
    PRINT\u newline
    PRINT\u newline\u TO
    ),并且在不写入空格的情况下清除标志
但是,直接写入文件对象(如使用
sys.stdout.write()
)时,会清除该标志(在执行写入之前):

(我使用了
if
块来防止解释器循环在两者之间写入提示符)

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

  • 写入
    sys.stdout
    并设置
    sys.stdout.softspace
  • sys.stdout.write('text')
    再次清除标志并写出
    text
  • 在写入
    之前,
    打印项目
    检查标志,发现标志未设置,然后写入
    。标志再次设置
  • 通过
    PRINT\u newline
    写入新行,再次清除该标志

所有这些都是为了跟踪一个简单的特性而做的大量工作,也是Python3迁移到打印函数的原因之一。请参阅。

我也在控制台中进行了尝试,并使用
如果为True:
一次执行所有命令;)谢谢你的解释@阿迈尔:我刚刚在那里偷了
如果是真的
想法;-)
(text)  # no space at all
>>> import sys
>>> if True:
...     sys.stdout.softspace = 1
...     sys.stdout.write('{}\n'.format(sys.stdout.softspace))
...     sys.stdout.softspace
...
1
0