Python函数传入的参数是否改变(函数参数、指针、引用)
不可變對象:Number, String, Tuple, bool
可變對象:List, Set, Dict 是可以改變內(nèi)部的元素
實例1(str類型):
def changestr (str):str = "inside"print "這是function中 , 值為:",str mystr = "outside" changestr(mystr) print "這是函數(shù)外邊 , 值為:",mystr輸出結(jié)果:
這是function中 , 值為: inside 這是函數(shù)外邊 , 值為: outside即 傳入不可變對象字符串,在函數(shù)內(nèi)對其操作不影響調(diào)用結(jié)束后字符串的值,即不發(fā)生改變。
ps: Number和Tuple結(jié)果是一樣的,這三種類型只能通過重新賦值來改變對象的值 .
實例2(list類型):
def changestr (str):str.append(3)print "這是function中 , 值為:",str mystr = [1,2] changestr(mystr) print "這是函數(shù)外邊 , 值為:",mystr結(jié)果:
這是function中 , 值為: [1, 2, 3] 這是函數(shù)外邊 , 值為: [1, 2, 3]ps:對于可變對象,在函數(shù)體中的修改 , 對對象本身的值發(fā)生了改變 , 在函數(shù)之外 , 該列表的內(nèi)容依然發(fā)生了改變 , 這是事先就能猜測到的結(jié)果 , 因為python中的參數(shù) , 傳入的是變量引用的副本 , 它與變量指向同一個值.
實例3(list類型):
def change2(list):list = [1,2,3,4] mylist = ["aa",21] print(mylist) change2(mylist) print(mylist)輸出結(jié)果:
['aa', 21] ['aa', 21]可變對象在函數(shù)體中的重新賦值 , 沒有對外部變量的值產(chǎn)生影響 , 不過仔細(xì)一想 , 卻又在情理之中 .
ps:即變量中存儲的是引用 , 是指向真正內(nèi)容的內(nèi)存地址(當(dāng)然 ,java中的八大基本數(shù)據(jù)類型 , 變量名和值都是存儲在堆棧中的 ) , 對變量重新賦值 , 相當(dāng)于修改了變量副本存儲的內(nèi)存地址 , 而這時的變量已經(jīng)和函數(shù)體外的變量不是同一個了, 在函數(shù)體之外的變量 , 依舊存儲的是原本的內(nèi)存地址 , 其值自然沒有發(fā)生改變 .
實例4(list類型):
def change2(list):list1 =listlist1.append(34) mylist = ["aa",21] print mylist change2(mylist) print mylist輸出結(jié)果:
['aa', 21] ['aa', 21, 34]- 函數(shù)體傳入的參數(shù) , 為函數(shù)體外變量引用的副本 .
- 在函數(shù)體中改變變量指向的堆中的值 , 對函數(shù)外變量有效.
- 在函數(shù)體中改變變量的引用 , 對函數(shù)外變量無效
要想不改變原list,用copy.deepcopy()
實例5(list類型):
import copy def change2(list):list1=copy.deepcopy(list)list1.append(34) mylist = ["aa",21] print mylist change2(mylist) print mylist結(jié)果:
['aa', 21] ['aa', 21]實例6(bool類型):
flag不做返回值,函數(shù)外不發(fā)生改變
flag=True def change2(list,flag):list.append(34)flag=Falsemylist = ["aa",21] print mylist change2(mylist,flag) print mylist,flag結(jié)果:
['aa', 21] ['aa', 21, 34] True實例7(bool類型):
flag作為返回值,返回值可用,但函數(shù)仍然不發(fā)生改變
flag=True def change2(list,flag):list.append(34)flag=Falsereturn flagmylist = ["aa",21] print mylist print change2(mylist,flag) print mylist,flag輸出結(jié)果:
['aa', 21] False ['aa', 21, 34] True?
總結(jié)
以上是生活随笔為你收集整理的Python函数传入的参数是否改变(函数参数、指针、引用)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS权威指南笔记之数据类型
- 下一篇: Shell生成随机uuid