python用轉義「和『的問題?

為什麼第二行輸出的字元串還是有?(我用的是3.4)


謝謝@Woj邀請。

簡單的說,這是因為直接通過解釋器顯示出來的字元串格式,跟通過print輸出的同一個字元串格式不一樣。

詳細展開來說。

同一個字元串有兩種表現形式。一種是它在代碼文本中書寫的樣子,這種是帶轉義的。所以\不是兩個字元,它只是字元的轉義形式。另一種是它在內存中的樣子,也是它邏輯上本來該有的樣子,或者說是它人腦中想像的樣子。所以內存中0x5c5c這兩個位元組,是兩個字元,和。

在解釋器里輸入字元串對象\(包括單引號),想表達一個斜杠。解釋器讀取過去,字元串原始內容在內存里就是兩個位元組0x5c5c。對於解釋器來說,你輸入的任何數據都是代碼。所以解釋器知道0x5c5c只是真正字元串的代碼文本形式(轉義形式),會對它進行逆轉義,得到字元串對象真正的樣子:一個位元組0x5c。

由於你輸入給解釋器的代碼只是一個對象(字元串對象),沒有任何其他操作,解釋器默認會直接輸出這個對象的字元串形式。python裡面,任何對象的字元串形式有兩種,一種是通過對象的repr方法返回的,一種是通過對象的str方法返回的。解釋器輸出的是對象的repr方法的返回結果。

前面說過字元串有兩種形式,python中字元串對象的repr方法返回的就是第一種形式。

剛說這些過程,在python 3.4.2源碼中的位置:sysmodule.c文件192行的sys_displayhook函數,fileobject.c文件128行的PyFile_WriteObject函數。


感覺樓上將得太專業了,我給你來個老土的。

首先:解釋器輸出的是對象的repr方法的返回結果。

普通的字元串repr後使用 「」包起來的。

&>&>&> repr(a)
"a"

帶有 」符號的字元串使用 『』 包起來的。這個是有本身就得對顯示時的 』進行轉義,不然包不住!!

&>&>&> repr(a")
a"

到這裡一切都是正常的。

但是當字元串中有 」和 』2個符號時,就發生了很奇妙的變化

&>&>&> repr(a")
a\"

這時為了讓那個轉義符號最後使用(比如print)的時候再去轉義,先用個轉義符號把他轉義了,字元串本身的那個 』與外麵包他的大哥衝突了,也用個轉義符號轉義了。所以字元串中的那個 其實是3個斜杠中 中間的那個。

不過整這麼多最後還是用回歸到使用上來,你第三行」好前面的反斜杠是多餘的。


推薦閱讀:

python中如何理解裝飾器代碼?
Python3中如何得到Unicode碼對應的中文?
Python函數中*和**的內涵究竟是什麼呢?
推薦幾本Python3相關書籍?最好分一下基礎、進階、高級
python3是如何處理字元異常的?

TAG:Python | Python3x | Python教程 |