python函式引數傳遞引用,引用計數

2021-07-26 20:32:16 字數 1893 閱讀 7133

引用計數會增加:

引用計數會減少:

del語句:

函式引數傳遞時,隱藏屬性

from ctypes import *

import os.path

import sys

defchange_x_int

(x):

print("x in func")

print(x)

print(id(x))

x = 100

print("after change")

print(x)

print(id(x))

y=200

print("before func")

print(id(y))

change_x_int(y)

print(y)

輸出為:

before func

1672975936

x in func

2001672975936

after change

1001672974336

200

可以發現,引數傳遞後變數改變前。位址並沒有發生改變,在函式體外是「1672975936」,在函式體內任為「1672975936」。但當將引數重新賦值時,引數位址發生了改變,變為:「1672974336」,並且y的值認為200並沒有變化。

這裡發生的事情是:進入change_x_int()時 y的引用計數+1,x指向y,為y的別名。當x發生改變是,y的引用計數-1,x拷貝值重新分配記憶體。

那麼設想:不經過函式體呼叫改變y值會發生什麼呢

>>> x=100

>>> id(x)

1672974336

>>> x+=1

>>> id(x)

1672974352

可見 改變x的值他的記憶體位址也發生了改變。這證明 變數x本身的性質就是這樣,當改變時重新分配記憶體,釋放原來的引用計數。

回到最初的例子,講函式變數改為list時情況會是怎麼樣呢?

def

change_list

(list_test):

print("list in func")

print(id(list_test))

print(list_test)

list_test[0]=100

print("list after func")

print(list_test)

print(id(list_test))

list_t=[20,'sarah','split']

print("list before func")

print(id(list_t))

change_list(list_t)

print(list_t)

輸出為:

list before func

49561352

list

in func

49561352

[20, 'sarah', 'split']

list after func

[100, 'sarah', 'split']

49561352

[100, 'sarah', 'split']

可見從改變到最後,位址均沒有發生改變。list為可變變數型別

查資料得知,python引數是否變化取決於變數本身的性質。當變數本身為可變變數時,改變變數本身。當變數本身不可變時,新建記憶體重新賦值。這機制不可名狀……

Python引數傳遞 引用傳遞 值傳遞

值傳遞 方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際引數的值。a1 520 a2 a1 print a1 520 print a2 520 a2 a1 1 print a2 521 print a1 520 引用傳遞 也稱位址傳遞,在方法呼叫時,實際上是把引...

python按引用傳遞引數

本文是python入門到函式遇到的疑惑。下面一段是基礎教程的原文python函式。所有引數 自變數 在python裡都是按引用傳遞。如果你在函式裡修改了引數,那麼在呼叫這個函式的函式裡,原始的引數也被改變了。例如 python view plain copy usr bin python 可寫函式說...

Python函式引數 按值傳遞和按引用傳遞

首先簡單說明一下,python中按值傳遞與按引用傳遞的區別 按值引數傳遞是指乙個變數的值來取代乙個函式引數的做法。如果這個值在函式 組中改變,對於呼叫這個函式的 來說,其中相應的變數值並不會受到任何影響,可以把這個引數認為是原變數值的乙個副本。按引用引數傳遞是指對於呼叫這個函式的 會維護這個 中變數...