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是如何處理字元異常的?