引用計數會增加:
引用計數會減少:
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中按值傳遞與按引用傳遞的區別 按值引數傳遞是指乙個變數的值來取代乙個函式引數的做法。如果這個值在函式 組中改變,對於呼叫這個函式的 來說,其中相應的變數值並不會受到任何影響,可以把這個引數認為是原變數值的乙個副本。按引用引數傳遞是指對於呼叫這個函式的 會維護這個 中變數...