Python中字串的修改及傳參詳解,python

來源:互聯網
上載者:User

Python中字串的修改及傳參詳解,python

發現問題

最近在面試的時候遇到一個題目,選擇用JavaScript或者Python實現字串反轉,我選擇了Python,然後寫出了代碼(錯誤的):

#!/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

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

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

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

思考如下

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

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

字串是由獨立的字元組成的,也是一種序列,序列的通用操作方法也適用於字串。

例如:

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

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

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

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

訪問字串舉例:

1 aString = 'Hello World!'2 print(aString[0])3 print(aString[1:5])4 print(aString[6:])

輸出:

HelloWorld!

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

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

例如:

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

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

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

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

1 aString = 'Hello World!'2 aString = aString[:3] + aString[4:]3 print(aString)

輸出:

Helo World!

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

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

#!/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 ts = 'abcd'print reverse(s)

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

也就是說,id(obj)函數返回對象obj在其生命週期內位於記憶體中的地址,id函數的參數類型是一個對象(Python中一切對象,變數中存放的是對象的引用)

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

#!/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 ts = 'abasdfasdfcdabasdfasdfcd'print id(s)print reverse(s)

輸出:

3826422438264224dcfdsafdsabadcfdsafdsaba

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.