一日一技:怎么你的字符串跟我不一樣
如果你經(jīng)常使用Python的命令行交互環(huán)境,你一定遇到過(guò)下面這個(gè)現(xiàn)象:
- >>> a = 'test'
- >>> a
- 'test'
- >>> print(a)
- test
首先定義一個(gè)變量a,它的值為字符串test?,F(xiàn)在,當(dāng)你在命令行交互環(huán)境直接輸入變量名再回車(chē)的時(shí)候,你看到的是'test',當(dāng)你輸入print(a)的時(shí)候,你看到的卻是test。
直接輸入變量名回車(chē),字符串會(huì)被單引號(hào)包起來(lái)。而使用print函數(shù)打印變量,字符串又沒(méi)有引號(hào)。
如果說(shuō)引號(hào)只是一個(gè)小問(wèn)題的話,再來(lái)看看反斜杠會(huì)怎么樣:
- >>> b = 'D:\game\pal4'
- >>> b
- 'D:\\game\\pal4'
- >>> print(b)
- D:\game\pal4
在這里,b變量的值為Windows下面的一個(gè)文件夾路徑。在定義的時(shí)候,我使用的是單根反斜杠。
當(dāng)我輸入變量名,然后回車(chē)時(shí),看到的結(jié)果是'D:\\game\\pal4',不僅有最外層的引號(hào),而且反斜杠全部變成了兩根。
但是當(dāng)我使用print函數(shù)打印出來(lái)的時(shí)候,一切又正常了。
覺(jué)得很詭異嗎?
實(shí)際上,輸入變量名,回車(chē)以后,你看到的才是這個(gè)字符串真正的樣子,因?yàn)樵赑ython里面是不存在單根反斜杠的。當(dāng)你要表示反斜杠本身的時(shí)候,就應(yīng)該是\\這種寫(xiě)法。
當(dāng)然在定義的時(shí)候你可以只寫(xiě)單根反斜杠,在大多數(shù)情況下,Python會(huì)理解你的意圖,所以它會(huì)自動(dòng)把單根反斜杠轉(zhuǎn)換為兩個(gè)反斜杠。
而使用print關(guān)鍵字打印出來(lái)的,是經(jīng)過(guò)Python優(yōu)化,更便于人類(lèi)閱讀的樣子。
當(dāng)然,使用print函數(shù)也能看到字符串真正的樣子,不過(guò)需要修改一下:
- >>> b = 'D:\game\pal4'
- >>> b
- 'D:\\game\\pal4'
- >>> print(repr(b))
- 'D:\\game\\pal4'
當(dāng)你使用repr函數(shù)先處理字符串,再打印時(shí),它的效果就和直接輸入變量名回車(chē)是一樣的了。
在Python中,repr(對(duì)象)本質(zhì)上是調(diào)用了對(duì)象的__repr__這個(gè)方法。而如果直接print(對(duì)象),實(shí)際上是打印了對(duì)象__str__方法返回的內(nèi)容。我們來(lái)做一個(gè)實(shí)驗(yàn):
- class Test:
- def __repr__(self):
- return 'hello world!'
- def __str__(self):
- return '為什么我總是對(duì)你說(shuō)你好,因?yàn)槟闶俏业氖澜绨?,傻?
- you = Test()
動(dòng)手測(cè)試一下,輸入you然后直接回車(chē)顯示的是什么內(nèi)容。輸入print(you)顯示的又是什么內(nèi)容。
運(yùn)行效果如下圖所示:
從上面的例子可以看出,直接輸入變量名回車(chē)和直接用print函數(shù)打印調(diào)用的是對(duì)象的不同方法。所以他們當(dāng)然可以不一樣。
回到昨天的問(wèn)題上來(lái)。在PyCharm的調(diào)試模式中,你看到的內(nèi)容實(shí)際上是變量對(duì)象的__repr__方法返回的內(nèi)容,這里的內(nèi)容是字符串在Python里面的真正的樣子,所以斜杠會(huì)變多。
上面說(shuō)到,當(dāng)你輸入Windows路徑的時(shí)候,大多數(shù)情況下,Python能夠理解你的意圖,把單根反斜杠轉(zhuǎn)成雙反斜杠。不過(guò)也有例外的情況,例如:假設(shè)有一個(gè)文件夾的名字叫做u6211。它在pal4文件夾里面。那么,路徑應(yīng)該是:D:\game\pal4\u6211 如果在Python里面執(zhí)行,會(huì)出現(xiàn)什么問(wèn)題?
- >>> c = 'D:\game\pal4\u6211'
- >>> c
- 'D:\\game\\pal4我'
- >>> print(c)
- D:\game\pal4我
怎么和前面的pal4拼在一起了?因?yàn)閈u6211是一個(gè)Unicode編碼,表示中文我。
這種情況下,你有兩種解決方式:
- 手動(dòng)使用雙反斜杠:
- >>> b = 'D:\game\pal4\\u6211'
- >>> b
- 'D:\\game\\pal4\\u6211'
- >>> print(b)
- D:\game\pal4\u6211
在定義變量的時(shí)候,字符串左側(cè)引號(hào)的左邊加上字母r:
- >>> b = r'D:\game\pal4\u6211'
- >>> b
- 'D:\\game\\pal4\\u6211'
- >>> print(b)
- D:\game\pal4\u6211
本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。