標籤:種類 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函數參數改變問題