首先你要明白,Python的函數傳遞方式是賦值,而賦值是通過建立變量與對象的關聯實現的。
成都創(chuàng)新互聯公司是一家專業(yè)提供憑祥企業(yè)網站建設,專注與成都網站制作、成都做網站、H5網站設計、小程序制作等業(yè)務。10年已為憑祥眾多企業(yè)、政府機構等服務。創(chuàng)新互聯專業(yè)網站設計公司優(yōu)惠進行中。
對于你的代碼:
執(zhí)行 d = 2時,你在__main__里創(chuàng)建了d,并讓它指向2這個整型對象。
執(zhí)行函數add(d)過程中:
d被傳遞給add()函數后,在函數內部,num也指向了__main__中的2
但執(zhí)行num = num + 10之后,新建了對象12,并讓num指向了這個新對象——12。
如果你明白函數中的局部變量與__main__中變量的區(qū)別,那么很顯然,在__main__中,d仍在指著2這個對象,它沒有改變。因此,你打印d時得到了2。
如果你想讓輸出為12,最簡潔的辦法是:
在函數add()里增加return num
調用函數時使用d = add(d)
代碼如下:
def add(num):
num += 10
return num
d = 2
d = add(d)
print d
和其他語言不一樣,傳遞參數的時候,python不允許程序員選擇采用傳值還是傳引用。
Python參數傳遞采用的肯定是“傳對象引用”的方式。實際上,這種方式相當于傳值和傳引用的一種綜合。如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當于通過“傳引用”來傳遞對象。如果函數收到的是一個不可變對象(比如數字、字符或者元組)的引用,就不能直接修改原始對象--相當于通過“傳值'來傳遞對象。
python一般內部賦值變量的話,都是傳個引用變量,和C語言的傳地址的概念差不多。可以用id()來查詢內存地址
如果a=b的話, a和b的地址是相同的;如果只是想拷貝,那么就得用 a=b[:]。
1. 函數賦值只是把函數名賦值給變量,并不是執(zhí)行函數,有無返回值都可以;
例如:a = function
2. 如果把調用函數賦值給變量,才是函數返回值賦值給變量;
如果沒有返回值,賦值變量的值為None;
例如 a = function( params )
意思是python中所有變量包括函數名都是一個對象,可以任意賦值
賦值(=),就是創(chuàng)建了對象的一個新的引用,修改其中任意一個變量都會影響到另一個。
淺拷貝:創(chuàng)建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,copy模塊的copy()函數}
深拷貝:創(chuàng)建一個新的對象,并且遞歸的復制它所包含的對象(修改其中一個,另外一個不會改變){copy模塊的deep.deepcopy()函數}