標籤:引用 變數 對象 類型
學習python首先要瞭解這三個的關係,變數、對象、引用、類型
這個要記住:類型存在於對象、變數通過引用連結上對象
變數在賦值的時候才建立,可以引用任何類型的對象、並且使用之前比許進行賦值。
<center>
例如:
》》:a = 3
其實是完成了三個事情:
1.建立了一個int類型的對象3
2.建立了一個名為a的對象
3.將變數名a與int類型的對象3相串連
變數實際上是到對象記憶體空間的一個指標,變數是一個系統資料表的元素,擁有指向對象的連結空間。
對象是分配的一塊記憶體,有足夠的空間去表示他們所代表的的值
引用是自動形成的從變數到對象的指標
記住:每一個對象都有兩個東西,物件類型和引用的計數器 這連個東西決定了是否自動回收。
對象的記憶體回收:每個對象保持了一個引用計數器,計數器記錄了當前指向該對象的引用的數目,一旦這個計數器為0,這個對象的記憶體空間就會被自動回收。
import sys
print(sys.getrefcount(L)) 查看引用對少次
getrefcount(...)getrefcount(object) -> integer Return the reference count of object. The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().
共用引用
思考:a = "3"b = aa = "spam"這樣輸出b會是多少?
變數a引用了spam對象的記憶體空間,所有值錢對象3肯定是還有引用的,那麼誰用呢就是變數b
a = 3
b = a
a = a + 3
L = [1,2,3]
L2 = L
L = 24
此時L2依然不會變,如果寫下面的語句替換L=24
L[0] = 24
這樣就更改了L2的值,因為列表L引用的是對象、L[0]是在原處修改了引用值,L與L2是共用引用的,所以L修改了第一個對象的引用,L2也會改變
更好的理解共用引用
==,is is 是比較實現應用的指標,如果不用變數名,引用相同指標,那麼返回true。
第一個題:A和B最初共用與引用,但是後來B重新指向了另一個對象,所以不影響A
第二題:A和B最初共用引用,但是列表支援在原處修改,所以賦值B[0]就是在原處修改了重新指向別的地方的指標,那麼A肯定也更改了,區別就在於B[0]就是在原處修改。
第三題,其實B=A[:]是建立了兩個list,A和B,即建立了兩個列表A,B,兩個擁有相同值的不同列表對象,所以B[0]在原處修改,不會影響A
Python-變數對象引用