python函數參數改變問題

來源:互聯網
上載者:User

標籤:種類   copy   set   種類型   python函數   操作   python   ges   epc   

python函數參數改不改變的問題

前幾天在做項目的過程中發現了一個問題,向函數中傳入一個list,在函數體內將其賦值給list,對list1操作後發現list也發生了變化,啊 ! 出乎意料。查了一下原因,原來python裡有可變對象和不可變對象之分。只有傳入的是不可變對象時,值才不發生改變,若是可變對象,充當函數參數時要注意了。

不可變對象:Number ,String , Tuple,bool
可變對象: List , Set , Dictionary是可以改變內部的元素

下面總結一下:

先看例子:

def changestr (str):    str = "inside"    print "這是function中 , 值為:",strmystr = "outside"changestr(mystr)print "這是函數外邊 , 值為:",mystr

輸出結果:

這是function中 , 值為: inside這是函數外邊 , 值為: outside

即 傳入不可變對象字串,在函數內對其操作不影響調用結束後字串的值,即不發生改變。

ps: Number和Tuple結果是一樣的,這三種類型只能通過重新賦值來改變對象的值 .

def changestr (str):    str.append(3)    print "這是function中 , 值為:",strmystr = [1,2]changestr(mystr)print "這是函數外邊 , 值為:",mystr

結果:

這是function中 , 值為: [1, 2, 3]這是函數外邊 , 值為: [1, 2, 3]
  • 對於可變對象,在函數體中的修改 , 對對象本身的值發生了改變 , 在函數之外 , 該列表的內容依然發生了改變 , 這是事先就能猜測到的結果 , 因為python中的參數 , 傳入的是變數引用的副本 , 它與變數指向同一個值.

3

def change2(list):    list = [1,2,3,4]mylist = ["aa",21]print(mylist)change2(mylist)print(mylist)

輸出結果:

[‘aa‘, 21][‘aa‘, 21]

可變對象在函數體中的重新賦值 , 沒有對外部變數的值產生影響 , 不過仔細一想 , 卻又在情理之中 .

  • 即變數中儲存的是引用 , 是指向真正內容的記憶體位址(當然 ,java中的八大基礎資料型別 (Elementary Data Type) , 變數名和值都是儲存在堆棧中的 ) , 對變數重新賦值 , 相當於修改了變數副本儲存的記憶體位址 , 而這時的變數已經和函數體外的變數不是同一個了, 在函數體之外的變數 , 依舊儲存的是原本的記憶體位址 , 其值自然沒有發生改變 .

3

def change2(list):    list1 =list    list1.append(34)mylist = ["aa",21]print mylistchange2(mylist)print mylist

輸出結果:

[‘aa‘, 21][‘aa‘, 21, 34]
  • 函數體傳入的參數 , 為函數體外變數引用的副本 .
  • 在函數體中改變變數指向的堆中的值 , 對函數外變數有效.
  • 在函數體中改變變數的引用 , 對函數外變數無效

要想不改變yuanlist,用copy.deepcopy()

import copydef change2(list):    list1=copy.deepcopy(list)    list1.append(34)mylist = ["aa",21]print mylistchange2(mylist)print mylist

結果:

[‘aa‘, 21][‘aa‘, 21]

python函數參數改變問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.