[英]string escape characters
有人可以解釋以下內容:
In [9]: str( """w'o"w""")
Out[9]: 'w\'o"w'
為什么雙引號沒有轉義? 無論是否使用轉義符,它都會執行相同的操作:
In [10]: print ( 'w\'o"w')
w'o"w
In [11]: print ( 'w\'o\"w')
w'o"w
在以下兩種情況下,無法逃脫:
In [12]: str( """w'o'w""")
Out[12]: "w'o'w"
In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'
但它們仍然與轉義版本等效:
In [14]: str("w\'o\'w")
Out[14]: "w'o'w"
In [15]: str( "w\"o\"w")
Out[15]: 'w"o"w'
有人可以向我解釋為什么Python具有這種“不一致”之處嗎? 擁有它們的優點是什么?
當Python控制台(包括IPython)顯示字符串的值時,它通過打印字符串的repr()
來實現。 repr()
將產生可以由Python解析器解析的輸出,因此在必要時它將包含反斜杠轉義符。 (並且僅在必要時)。 如果字符串中的所有引號都是單引號,則repr()
將為您顯示帶雙引號的字符串,而不必使用反斜杠。 如果字符串中的所有引號都是雙引號,則repr()
會為您顯示帶單引號的字符串,而不必使用反斜杠。 如果字符串包含單引號和雙引號混合,則需要反斜杠。
至於print()
調用發生了什么-他們不打印字符串的repr()
,而是顯示該str()
值,這是不添加反斜杠轉義的字符串本身(和沒有引號)。
所以這是每個示例中發生的事情:
In [9]: str( """w'o"w""")
Out[9]: 'w\'o"w'
您將獲得字符串w'o"w
的值,並且IPython在輸出中顯示該值 。因此它將在值上調用repr()
,從而在其w'o"w
引號並在其中使用反斜杠。
In [10]: print ( 'w\'o"w')
w'o"w
要打印的字符串w'o"w
,沒有得到它的值,所以IPython的是顯示打印字符串注意沒有。 Out[10]
-在print()
函數返回None
,和IPython的抑制輸出值的時候都None
。
In [11]: print ( 'w\'o\"w')
w'o"w
同樣的事情:您正在打印字符串,而不是IPython向您顯示值。 因此它使用str()
而不是repr()
。
In [12]: str( """w'o'w""")
Out[12]: "w'o'w"
在這里,您顯示的是字符串的值,因此它得到了引號。 但是沒有反斜杠,因為它們不需要代表字符串。
In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'
同上:沒有反斜線,因為它們不需要代表字符串。
In [14]: str("w\'o\'w")
Out[14]: "w'o'w"
這里也一樣: repr()
輸出中沒有反斜杠,因為不需要使用反斜杠來表示字符串。
In [15]: str( "w\"o\"w")
Out[15]: 'w"o"w'
這里也一樣: repr()
輸出中沒有反斜杠,因為不需要用反斜杠來表示字符串。
我希望這可以幫助您了解發生了什么事情。
當您用single quotes
將字符串引起來時,您需要在字符串內轉義single quotes
-否則解釋器將如何知道該字符串是否應以結尾結尾?
相反,當您使用double quotes
將字符串double quotes
,需要在字符串中轉義double quotes
。
"""
引號引起來的"""
是一個例外-可以很聰明地根據要包含的字符串的內容來更改其行為。如果將包含單引號的String括起來,則其行為就好像用雙引號將其引起來一樣。如果將包含雙引號的String括起來,則if的行為就好像您已經用單引號將其括起來一樣
您必須轉義字符串字符開始/結束的唯一原因是,編譯器/解釋器知道該符號並不意味着字符串范圍的開始/結束。
因此,如果字符是'
,則'
成為特殊字符,而"
不是”。反之亦然。如果以'''
或"""
(多行字符串)開頭,則兩個字符都不是特殊字符,因此也不是需要逃脫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.