看兩個例子:
a = 1
deffun
(a):
a = 2
fun(a)
print a # 1
a =
deffun
(a):
fun(a)
print a # [1]
所有的變數都可以理解是記憶體中乙個物件的「引用」,或者,也可以看似c中void*的感覺。
a = 1
deffun
(a):
print
"func_in",id(a) # func_in 41322472
a = 2
print
"re-point",id(a), id(2) # re-point 41322448 41322448
print
"func_out",id(a), id(1) # func_out 41322472 41322472
fun(a)
print a # 1
注:具體的值在不同電腦上執行時可能不同。
可以看到,在執行完a = 2
之後,a
引用中儲存的值,即記憶體位址發生變化,由原來1
物件的所在的位址變成了2
這個實體物件的記憶體位址。
而第2個例子a
引用儲存的記憶體值就不會發生變化:
a =
deffun
(a):
print
"func_in",id(a) # func_in 53629256
print
"func_out",id(a) # func_out 53629256
fun(a)
print a # [1]
這裡記住的是型別是屬於物件的,而不是變數。而物件有兩種,「可更改」(mutable)與「不可更改」(immutable)物件。在python中,strings, tuples, 和numbers是不可更改的物件,而 list, dict, set 等則是可以修改的物件。(這就是這個問題的重點)
當乙個引用傳遞給函式的時候,函式自動複製乙份引用,這個函式裡的引用和外邊的引用沒有半毛關係了.所以第乙個例子裡函式把引用指向了乙個不可變物件,當函式返回的時候,外面的引用沒半毛感覺.而第二個例子就不一樣了,函式內的引用指向的是可變物件,對它的操作就和定位了指標位址一樣,在記憶體裡進行修改.
如果還不明白的話,這裡有更好的解釋:
list =
for i in range(10):
print(list)
#[, , , , , , , , , ]
list =
a =
for i in range(10)
a['num'] = i
print(list)
[, , , , , , , , , ]
Python的函式引數傳遞
原址 我想,這個標題或許是很多初學者的問題。尤其是像我這樣的對c c 比較熟悉,剛剛進入python殿堂的朋友們 c c 的函式引數的傳遞方式根深蒂固的影響這我們的思維 引用?傳值?究竟是那種呢。呵呵,語言的特性決定了是使用的方法,那麼,現在我們來 一下python的函式引數傳遞方式。在開始之前,我...
Python的函式引數傳遞
看兩個例子 python a 1 def fun a a 2 fun a print a 1 a 1 def fun a a 2 fun a print a 1 python a def fun a fun a print a 1 所有的變數都可以理解是記憶體中乙個物件的 引用 或者,也可以看似c中...
Python函式的引數傳遞
可更改 mutable 與不可更改 immutable 物件 在 python 中,strings,tuples,和 numbers 是不可更改的物件,而 list,dict 等則是可以修改的物件。不可變型別 變數賦值 a 5 後再賦值 a 10,這裡實際是新生成乙個 int 值物件 10,再讓 a...