Python的函式引數傳遞

2021-08-21 04:49:09 字數 1551 閱讀 1062

看兩個例子:

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...