2014-06-16 195 views
1

有人可以解釋如下:字符串轉義字符

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有這種'不一致'?有他們的優點是什麼?

+0

你能澄清你在問什麼嗎?是你的問題爲什麼值顯示*,因爲它們是,或者是你的問題爲什麼輸入字符串有或沒有轉義不會改變它的值? – BrenBarn

+0

我的問題通過@rmunn的第一段完美回答。 –

回答

4

當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()這個值,它在裏面引用引號和反斜槓。

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()輸出沒有反斜槓,因爲不是在需要他們代表的字符串。

我希望這可以幫助你更好地理解發生了什麼。

0

當您使用single quotes包含字符串時,您需要在字符串內轉義single quotes - 否則解釋器如何知道該字符串是否意味着結束?

相反,當您使用double quotes包圍字符串時,您需要在字符串內轉義double quotes

"""包含引號是一個例外 - 它足夠聰明,可以根據所包含的字符串的內容來改變它的行爲。如果你包含一個包含單引號的字符串,它將表現得就像你用雙引號括起來一樣。如果你包含一個包含雙引號的字符串,如果將表現得好像用單引號括起來一樣

0

你必須避開字符串開始/結尾的唯一原因是編譯器/解釋器知道那個符號並不意味着字符串範圍的開始/結束。

因此,如果字符是',那麼'變成了特殊字符,並且"不是。反之亦然。如果您使用'''"""(多行字符串)啓動它,則兩個字符都不是特殊的,因此都不需要轉義。