Python中字符串的修改及傳參詳解
發(fā)現(xiàn)問(wèn)題
最近在面試的時(shí)候遇到一個(gè)題目,選擇用JavaScript或者Python實(shí)現(xiàn)字符串反轉(zhuǎn),我選擇了Python,然后寫(xiě)出了代碼(錯(cuò)誤的):
#!/usr/bin/env python #-*-coding:utf-8-*- __author__ = 'ZhangHe' def reverse(s): l = 0 r = len(s) - 1 while l < r: s[l],s[r] = s[r],s[l] l += 1 r -= 1 return s
然后面試官問(wèn)了兩個(gè)問(wèn)題:
(1)可以這樣修改字符串的值嗎?【我回答的,可以】【回答錯(cuò)誤】
(2)傳入的參數(shù)是地址?還是副本?【我回答的,傳值。數(shù)字,字符串,元組傳值(immutable);list和dict傳引用(mutable);】【回答傳值,可以直接修改】【回答錯(cuò)誤,正確的是傳值,immutable】
思考如下
雖然經(jīng)常使用字符串,但是還真沒(méi)有研究過(guò)這個(gè)問(wèn)題,于是上網(wǎng)搜了一下資料:
Python中的字符串是不可變類(lèi)型,就是說(shuō)改變一個(gè)字符串的元素需要新建一個(gè)新的字符串。
字符串是由獨(dú)立的字符組成的,也是一種序列,序列的通用操作方法也適用于字符串。
例如:
通過(guò)切片操作順序地訪問(wèn)子串;
通過(guò)len()求字符串的長(zhǎng)度等;
通過(guò)in或not in操作符判斷字符串中是否存在某個(gè)字符。
Python里面沒(méi)有字符這個(gè)類(lèi)型,而是用長(zhǎng)度為1 的字符串來(lái)表示這個(gè)概念,當(dāng)然,這其實(shí)也是一個(gè)子串。
訪問(wèn)字符串舉例:
1 aString = 'Hello World!' 2 print(aString[0]) 3 print(aString[1:5]) 4 print(aString[6:])
輸出:
H ello World!
那么如何改變一個(gè)字符串呢?
可以通過(guò)給一個(gè)變量賦值(或者重賦值)的方式“更新”一個(gè)已有的字符串。新的值可能與原有值差不多,也可能跟原有串完全不同。
例如:
1 aString = 'Hello World!' 2 aString = aString[:6] + 'Python!' 3 print(aString) 4 aString = 'different string altogether' 5 print(aString)
輸出:
Hello Python! different string altogether
那么如何刪除一個(gè)字符或字符串呢?
再重復(fù)一遍,字符串是不可變的,所以不能僅僅刪除一個(gè)字符串里的某個(gè)字符,你能做的是清空一個(gè)空字符串,或者是把剔除了不需要的部分后的字符串組合起來(lái)形成一個(gè)新串。
假設(shè)您想要從“Hello World!”里面刪除小寫(xiě)的“l(fā)”,那么您需要這樣做:
1 aString = 'Hello World!' 2 aString = aString[:3] + aString[4:] 3 print(aString)
輸出:
Helo World!
通過(guò)賦一個(gè)空字符串或者使用del 語(yǔ)句來(lái)清空或者刪除一個(gè)字符串。不過(guò),在大部分應(yīng)用程序里,沒(méi)有必要顯式的刪除字符串。定義這個(gè)字符串的代碼最終會(huì)結(jié)束,那時(shí)Python 會(huì)自動(dòng)釋放這些字符串。
所以,我寫(xiě)的反轉(zhuǎn)字符串代碼是有問(wèn)題的,正確的代碼應(yīng)該是:
#!/usr/bin/env python #-*-coding:utf-8-*- __author__ = 'ZhangHe' def reverse(s): t = '' r = len(s) - 1 while r>=0: t = t + s[r] r -= 1 return t s = 'abcd' print reverse(s)
那么傳入的形參s和實(shí)參s到底是不是同一個(gè)對(duì)象呢?可以用id函數(shù)來(lái)驗(yàn)證,先來(lái)看下id函數(shù)的官方解釋。
也就是說(shuō),id(obj)
函數(shù)返回對(duì)象obj在其生命周期內(nèi)位于內(nèi)存中的地址,id函數(shù)的參數(shù)類(lèi)型是一個(gè)對(duì)象(Python中一切對(duì)象,變量中存放的是對(duì)象的引用)
我們可以用下邊的代碼驗(yàn)證:
#!/usr/bin/env python #-*-coding:utf-8-*- __author__ = 'ZhangHe' def reverse(s): print id(s) t = '' r = len(s) - 1 while r>=0: t = t + s[r] r -= 1 return t s = 'abasdfasdfcdabasdfasdfcd' print id(s) print reverse(s)
輸出:
38264224 38264224 dcfdsafdsabadcfdsafdsaba
可以看出傳入的參數(shù)實(shí)際上是字符串對(duì)象的地址,如果把參數(shù)換成list或dict,那么輸出的id還是一樣的,所以所,Python中傳參的方式都是傳入對(duì)象的地址,只不過(guò)數(shù)字,字符串和tuple是不可直接修改,而list和dict是可以直接修改。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- python獲取指定字符串中重復(fù)模式最高的字符串方法
- Python實(shí)現(xiàn)統(tǒng)計(jì)給定字符串中重復(fù)模式最高子串功能示例
- Python字符串的修改方法實(shí)例
- Python中修改字符串的四種方法
- Python使用正則實(shí)現(xiàn)計(jì)算字符串算式
- Python 字符串操作方法大全
- python字符串連接的N種方式總結(jié)
- Python實(shí)現(xiàn)字符串與數(shù)組相互轉(zhuǎn)換功能示例
- python分割和拼接字符串
- Python內(nèi)置的字符串處理函數(shù)整理
- python統(tǒng)計(jì)字符串中指定字符出現(xiàn)次數(shù)的方法
- python實(shí)現(xiàn)修改固定模式的字符串內(nèi)容操作示例
相關(guān)文章
如何在Flask中實(shí)現(xiàn)數(shù)據(jù)分組流程詳解
在Flask中,數(shù)據(jù)分組是指將一組數(shù)據(jù)按照某種方式進(jìn)行分類(lèi),以便更好地對(duì)數(shù)據(jù)進(jìn)行處理和展示,可以使用Python內(nèi)置的itertools模塊中的groupby方法,或者使用SQL語(yǔ)句中的GROUP?BY子句來(lái)實(shí)現(xiàn)數(shù)據(jù)分組,這篇文章介紹了在Flask中實(shí)現(xiàn)數(shù)據(jù)分組,感興趣的同學(xué)可以參考下文2023-05-05機(jī)器學(xué)習(xí)的框架偏向于Python的13個(gè)原因
這篇文章主要為大家詳細(xì)介紹了機(jī)器學(xué)習(xí)的框架偏向于Python的13個(gè)原因,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Python簡(jiǎn)單實(shí)現(xiàn)詞云圖代碼及步驟解析
這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)詞云圖代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06解決python selenium3啟動(dòng)不了firefox的問(wèn)題
今天小編就為大家分享一篇解決python selenium3啟動(dòng)不了firefox的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Python中requirements.txt簡(jiǎn)介(推薦)
Python項(xiàng)目中必須包含一個(gè)?requirements.txt?文件,用于記錄所有依賴包及其精確的版本號(hào),以便新環(huán)境部署,這篇文章主要介紹了Python中requirements.txt簡(jiǎn)介,需要的朋友可以參考下2022-11-11python2.7無(wú)法使用pip的解決方法(安裝easy_install)
下面小編就為大家分享一篇python2.7無(wú)法使用pip的解決方法(安裝easy_install),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04python打開(kāi)音樂(lè)文件的實(shí)例方法
在本篇文章里小編給大家整理的是一篇關(guān)于python打開(kāi)音樂(lè)文件的實(shí)例方法,有需要的朋友們學(xué)習(xí)參考下。2020-07-07django mysql數(shù)據(jù)庫(kù)及圖片上傳接口詳解
這篇文章主要介紹了django mysql數(shù)據(jù)庫(kù)及圖片上傳接口詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07