天天看點

Python字元串的修改以及傳參

前兩天去面試web developer,面試官提出一個問題,用JavaScript或者Python實作字元串反轉,我選擇了Python,然後寫出了代碼(錯誤的):

Python字元串的修改以及傳參
Python字元串的修改以及傳參

然後面試官問了兩個問題:

(1)可以這樣修改字元串的值嗎?【我回答的,可以】【回答錯誤】

(2)傳入的參數是位址?還是副本?【我回答的,傳值。數字,字元串,元組傳值(immutable);list和dict傳引用(mutable);】【回答傳值,可以直接修改】【回答錯誤,正确的是傳值,immutable】

雖然經常使用字元串,但是還真沒有研究過這個問題,于是上網搜了一下資料:

Python中的字元串是不可變類型,就是說改變一個字元串的元素需要建立一個新的字元串。

字元串是由獨立的字元組成的,也是一種序列,序列的通用操作方法也适用于字元串。例如:

通過切片操作順序地通路子串;

通過len()求字元串的長度等;

通過in或not in操作符判斷字元串中是否存在某個字元。

Python裡面沒有字元這個類型,而是用長度為1 的字元串來表示這個概念,當然,這其實也是一個子串。

通路字元串舉例:

輸出:

H

ello

World!

那麼如何改變一個字元串呢?

可以通過給一個變量指派(或者重指派)的方式“更新”一個已有的字元串。新的值可能與原有值差不多,也可能跟原有串完全不同。例如:

Hello Python!

different string altogether

那麼如何删除一個字元或字元串呢?

再重複一遍,字元串是不可變的,是以不能僅僅删除一個字元串裡的某個字元,你能做的是清空一個空字元串,或者是把剔除了不需要的部分後的字元串組合起來形成一個新串。

假設您想要從“Hello World!”裡面删除小寫的“l”,那麼您需要這樣做:

Helo World!

通過賦一個空字元串或者使用del 語句來清空或者删除一個字元串。不過,在大部分應用程式裡,沒有必要顯式的删除字元串。定義這個字元串的代碼最終會結束,那時Python 會自動釋放這些字元串。

是以,我寫的反轉字元串代碼是有問題的,正确的代碼應該是:

Python字元串的修改以及傳參
Python字元串的修改以及傳參

那麼傳入的形參s和實參s到底是不是同一個對象呢?可以用id函數來驗證,先來看下id函數的官方解釋。

Python字元串的修改以及傳參

也就是說,id(obj)函數傳回對象obj在其生命周期内位于記憶體中的位址,id函數的參數類型是一個對象(Python中一切對象,變量中存放的是對象的引用)

我們可以用下邊的代碼驗證:

Python字元串的修改以及傳參
Python字元串的修改以及傳參

38264224

dcfdsafdsabadcfdsafdsaba

可以看出傳入的參數實際上是字元串對象的位址,如果把參數換成list或dict,那麼輸出的id還是一樣的,是以所,Python中傳參的方式都是傳入對象的位址,隻不過數字,字元串和tuple是不可直接修改,而list和dict是可以直接修改。

本文轉自ZH奶酪部落格園部落格,原文連結:http://www.cnblogs.com/CheeseZH/p/5186916.html,如需轉載請自行聯系原作者