什么是python语言的动态类型机制_理解Python的Dynamic typing
Python的Dynamic typing有些類似于C語(yǔ)言的指針,在C中,一個(gè)變量可以指向任何地址空間,在Python中,一個(gè)變量也可以指向任何type的數(shù)據(jù)對(duì)象。變量的指向可以在程序運(yùn)行過(guò)程中變化,這就是我理解的Dynamic typing。
Python是高層次的編程語(yǔ)言,在使用Python的時(shí)候,我們要忘掉用C開(kāi)發(fā)時(shí)的習(xí)慣,不要關(guān)注底層細(xì)節(jié)。不需要關(guān)心這個(gè)變量占幾個(gè)字節(jié),不需要考慮這個(gè)指針free之后,有沒(méi)有賦空值,不需要考慮溢出等等。
在Python中,所有的一切都是對(duì)象,包括一個(gè)小小的變量。先看下面的代碼示例:
>>> aa = 1
>>> id(aa)
1469710800
>>> aa = 2
>>> id(aa)
1469710832
id這個(gè)builtin函數(shù)返回的是變量所指向的地址,當(dāng)然,這個(gè)地址我們看不懂,不過(guò)至少我們可以看到,在給aa重新賦值之后,地址變了!
這里就是理解Python Dynamic typing的關(guān)鍵:
給aa重新賦值,不是改變aa的值,而是讓aa指向另外一個(gè)地址,這個(gè)地址含有一個(gè)新的值!
Python中變量是類似于C語(yǔ)言的指針的存在
我們還可以這樣:
>>>
>>> aa = 1
>>> id(aa)
1469710800
>>> aa = 2
>>> id(aa)
1469710832
>>>
>>> aa = '333'
>>> id(aa)
10637360
讓aa指向一個(gè)string對(duì)象。
再看兩個(gè)圖:
共享引用
改變的值指向,而不是對(duì)象值
Python的垃圾回收
Python是使用引用計(jì)數(shù)方式來(lái)進(jìn)行垃圾收集。
例如上例中當(dāng)aa重新被賦值'333'時(shí)候,由于對(duì)象1和2的引用計(jì)數(shù)從1到0(給aa賦值'333'時(shí)候'333'的引用計(jì)數(shù)加1),所以自動(dòng)進(jìn)行了垃圾回收.
但是有個(gè)問(wèn)題是:如果在Python中發(fā)生,兩個(gè)對(duì)象互相引用,那么引用計(jì)數(shù)的方式是否會(huì)失效?還是Python本身也可以使用"離開(kāi)作用域則對(duì)象失效"的垃圾收集方式。這確實(shí)無(wú)法避免(互相引用),所以有些Python實(shí)現(xiàn)使用了"離開(kāi)作用域則進(jìn)行變量銷毀"的垃圾收集機(jī)制。
可變(mutable)對(duì)象和不可變(immutable)對(duì)象
元組(tuple)、數(shù)值型(number)、字符串(string)均為不可變對(duì)象;
而字典型(dictionary),列表型(list),集合(set)的對(duì)象是可變對(duì)象。(Python官方對(duì)mutable對(duì)象的解釋是:Mutable objects can change their value but keep their id().)
我的理解:對(duì)象是不可變的,即變量指向的那塊內(nèi)存空間的內(nèi)容不能變;對(duì)象是可變的,即變量指向的那塊內(nèi)存空間的內(nèi)容可以改變。而函數(shù)調(diào)用,傳遞的都是變量的指向(ref)。
>>> kk = 5
>>>
>>> def test(pp):
... print(id(pp))
...
>>>
>>> id(kk)
1469710928
>>> test(kk)
1469710928
>>>
變量引用的比較
直接看代碼吧:
>>> aa = 1
>>> id(aa)
1469710800
>>> aa = 2
>>> id(aa)
1469710832
>>>
>>> aa = '333'
>>> id(aa)
10637360
>>>
>>> bb = aa
>>> bb == aa
True
>>> bb is aa
True
>>>
>>> import sys
>>> sys.getrefcount(1)
106
>>> sys.getrefcount(2)
76
>>> sys.getrefcount('333')
4
>>> sys.getrefcount(aa)
3
>>> sys.getrefcount(bb)
3
>>>
可以直接使用is來(lái)進(jìn)行比較判斷。
總結(jié)
以上是生活随笔為你收集整理的什么是python语言的动态类型机制_理解Python的Dynamic typing的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 燃脂片减肥有什么危害
- 下一篇: python3.7和3.5_Ubuntu