標籤:

Python 參數傳引用還是傳值?

本文由黃哥寫於多年前,再次分享出來。其中代碼是Python2 語法。

Python程序中存儲的所有數據都是對象,每一個對象有一個身份,一個類型和一個值。

看變數的實際作用,執行a = 8 這行代碼時,就會創建一個值為8的int對象。

變數名是對這個"一個值為8的int對象"的引用。(也可以簡稱a綁定到8這個對象)

1、可以通過id()來取得對象的身份

這個內置函數,它的參數是a這個變數名,這個函數返回的值

是這個變數a引用的那個"一個值為8的int對象"的內存地址。

>>> a = 8n >>> id(8)n 4298180944nn >>> help(id)n Help on built-in function id in module __builtin__:nn id(...)n id(object) -> integern Return the identity of an object. This is guaranteed to be unique amongn simultaneously existing objects. (Hint: its the objects memory address.)n

2、可以通過type()來取得a引用對象的數據類型

>>> a = 8n >>> id(8)n 4298180944n >>> type(a)n <type int>n

3、對象的值

當變數出現在表達式中,它會被它引用的對象的值替代。

總結:類型是屬於對象,而不是變數。變數只是對對象的一個引用。

對象有可變對象和不可變對象之分。

Python函數傳遞參數到底是傳值還是引用?

傳值、引用這個是c/c++中的概念,Python中一切都是對象,

實參向形參傳遞的是對象的引用值。就像Python賦值的意思。

請看代碼

#coding:utf-8nn def foo(a):n print "傳來是對象的引用 對象地址為{0}".format(id(a))n a = 3 #形式參數a是局部變數、a重新綁定到3這個對象。n print "變數a新引用對象地址為{0}".format(id(a))n print ann x = 5n print "全局變數x引用的對象地址為{0}".format(id(x))n foo(x)n print xn #由於函數內部a綁定到新的對象,也就修改不了全部變數x引用的對象5n #全局變數x引用的對象地址為4298181192n #傳來是對象的引用 對象地址為4298181192n #變數a新引用對象地址為4298181240n #3n #5nn #coding:utf-8nn def foo(a):n """在函數內部直接修改了同一個引用指向的對象。n 也就修改了實際參數傳來的引用值指向的對象。n """n a.append("can change object")n return ann lst = [1,2,3]n print foo(lst)n print lstn #[1, 2, 3, can change object]n #[1, 2, 3, can change object]nnn #coding:utf-8nn def foo(a):n """實際參數傳來一個對象[1,2,3]的引用,當時形式參數(局部變數an 重新引用到新的對象,也就是說保存了新的對象)n 當然不能修改原來的對象了。n """n a = ["黃哥Python培訓","黃哥"]n return ann lst = [1,2,3]n for item in foo(lst):n print itemn print lstn

總結:Python函數傳遞的是對象的引用值,非傳值或傳引用。

但是如果對象是不可變的,感覺和c語言中傳值差不多。

如果對象是可變的,感覺和c語言中傳引用差不多。

最有價值的是:講編程思路的視頻、作業訓練和答疑服務。

錄製好的50講視頻+作業訓練+qq答疑 效果等於面授。

歡迎參加黃哥python遠程視頻培訓,幫你完成從不會寫代碼到會寫代碼解決問題的過渡。

pythonpeixun/article

諮詢qq:1465376564

部分免費python免費視頻

pythonpeixun/article


推薦閱讀:

TAG:Python |