天天看點

python 變量傳值傳引用 區分

傳值:strings tuples numbers

傳引用: list dict

python的變量都可以看成是記憶體中某個對象的引用。(變量指向該記憶體位址存儲的值)

1.python中的可更改對象和不可更改對象

python中的對象可以分為可更改(mutable)對象與不可更改(immutable)對象

strings, tuples, 和numbers是不可更改的對象

如果某個變量指向不可更改的對象,則重新指派時。原對象被抛棄,變量會指向一個新對象。

list,dict等則是可以修改的對象

如果是整個重新指派可更改對象。一樣是原對象被抛棄,變量指向一個新開辟的記憶體對象。

但如果是修改可更改對象的部分值,變量還是指向原位址,原對象也會相應修改。

如圖:nfoo是numbers為不可更改對象,lstFoo是list為可更改對象

當重新指派時,發生的改變如下圖

python 變量傳值傳引用 區分

如圖,左邊數值類型為不可變對象,變量若重新指派,原對象被抛棄,指向一個新對象。

右邊是一個清單,改變清單中的元素,變量依舊指向清單的首位址。但是由于清單存儲的是每個元素在記憶體中的位址(也是引用),是以改變某個元素值,是該元素抛棄原對象指向一個新對象。

2.python的函數是引用調用,還是傳值調用?

在函數參數傳值時,變量也是記憶體對象的引用。

當對象為可更改對象時,是引用調用,函數内參數的改變會影響到原始對象。

當對象為不可更改對象時,就隻是相當于傳值調用。