2017-05-19 47 views
2

原本我以爲:打印如何處理逗號?

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 

任何人都可以解釋這種現象?我只是好奇

回答

2

打印包括將項目轉換爲字符串,然後將它們寫入文件對象(默認爲sys.stdout)。在Python 2中,print語句在您寫入的文件對象上保留一個標誌,稱爲軟空間標誌。請參閱Python C API中的file.softspace attributePyFile_SoftSpace() function

此標誌用於跟蹤何時寫入空間。印刷在內部實現爲一系列的PRINT_ opcodes,而那些管理標誌:

  • 打印的項目(與PRINT_ITEMPRINT_ITEM_TO)首先檢查標誌,如果它被設置會寫一個空間,寫項目之後out將會再次設置標誌
  • 寫一個換行符是一個單獨的操作碼(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.stdoutsys.stdout.softspace設置。
  • sys.stdout.write('text')再次清除國旗和寫)PRINT_ITEM檢查前旗寫出text
  • ,發現它沒有設置,並寫入)。該標誌再次設置。
  • 一條換行符是PRINT_NEWLINE,再次清除標誌。

所有這一切都做了大量的工作,以保持一個簡單的功能的軌道,和了Python 3移動到功能印刷的原因之一。見PEP 3105

+0

我也試過在控制檯中,我用'如果是真的:'立即執行所有命令;)謝謝你的好解釋! – Aemyl

+0

@Aemyl:我剛剛走了,偷了'如果真'的想法;-) –

+0

你沒有偷它,我告訴你,你可以使用它,如果你想:) – Aemyl

相關問題