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