標籤:python基礎
在python中,類型是在運行過程中自動決定的,不是通過代碼的聲明。---非常重要
>>> a=666
建立一個對象來代表值666(類型的概念是存在於對象中而不是變數名中)
建立一個變數a(在賦值時建立變數)
將變數與新的對象3相串連
變數名和對象,在運行a=666後,變數a變成對象666的一個引用,在內部,變數事實上是到對象記憶體空間的一個指標(通過運行常量運算式666而建立)。
在python中從變數到對象的串連稱作引用。引用是一種關係,以記憶體中的指標形式實現。
變數是一個系統資料表的元素,擁有指向對象的串連的空間
對象是分配的一塊記憶體,有足夠的空間儲存他們所代表的值
引用是變數到對象的指標
一個對象都有兩個標準的頭部資訊,一個類型標誌符去標識這個對象的類型,一個引用計數器,用來決定是不是可以回收這個對象。
垃圾收集:
如果這個對象沒有變數名引用了,python的垃圾收集機制就會回收記憶體。是通過這個對象的引用計數器來判斷是否有引用的。
共用引用:
多個變數名引用同一個對象,稱為 共用引用;
>>> a=666
>>> b=a
>>> a
666
>>> b
666
>>> a=666
>>> b=a
>>> b
666
>>> a='fuck'
>>> b
666
>>>當賦值完fuck後,由常量運算式fuck建立了新的對象(記憶體空間),但變數b依然引用原始的對象666,這個賦值運算改變的不是對象3,而是改變了變數a的引用。從而變數b未改變。(並不是替換原來的對象)
註:給變數賦一個新值,不是替換了原始的對象,而是讓這個變數去引用完全不同的一個對象。
共用引用和在原處修改,以下是列表
>>> L1=[1,2,3,4]
>>> L2=L1
>>> L2
[1, 2, 3, 4]
>>> L1[0]=666
>>> L1
[666, 2, 3, 4]
>>> L2
[666, 2, 3, 4]
>>>
共用引用和相等
>>> a=1111
>>> b=1111
>>> a is b
False
>>> a==b
True
>>> x=999
>>> y=x
>>> x is y
True
>>> x==y
True
其中“==”比較的是兩個被引用的對象的值是否相等,而is操作符是檢查對象的同一性,兩個變數是否指向同一個對象。
註:例
>>> x=11
>>> x='fuck'
對象11是否立刻被python垃圾收集回收了?不會的。python緩衝並服用了小的整數和小的字串。如:
>>> m=1111
>>> n=1111
>>> n is m
False
>>> c=11
>>> d=11
>>> c is d
True #小的整數和字串被緩衝、複用
>>> g=1000
>>> f=1000
>>> g is f
False
查詢對象被引用多少次,使用sys模組的getrefcount(對象)
>>> import sys
>>> sys.getrefcount(11)
20
>>> sys.getrefcount('fuck')
4
python動態類型