Python錯題集
阿新 • • 發佈:2018-05-08
錯題 分析 Python 總結 知錯能改
a4 = "HelloWorld"
a5 = "HelloWorld"
a6 = "HelloWorld"
a7 = "HelloWorld"
a8 = "HelloWorld"
a9 = "HelloWorld"
python會不會創建9個對象呢?在內存中會不會開辟9個”HelloWorld”的內存空間呢? 想一下,如果是這樣的話,我們寫10000個對象,比如a1=”HelloWorld”…..a1000=”HelloWorld”, 那他豈不是開辟了1000個”HelloWorld”所占的內存空間了呢?如果真這樣,內存不就爆了嗎?所以python中有這樣一個機制——intern機制,讓他只占用一個”HelloWorld”所占的內存空間。靠引用計數去維護何時釋放。
1.設置變量a=2, 變量b=a, 然後再設置a=3, 此時再查看b也會等於3
- 答案解析:
變量a=2, b=a, 再將a=3後,此時查看a的結果是3,但b的結果依然是2,因為b=a其實不將b變量指向了a,而是把b的值 指向在了a變量所指向的值 ,如果 a 之後又改成了3,python解釋器會開辟一塊新的內存空間並將值 存為3,然後a內存的指針就指向了3的地址,但2所在的內存地址是不變的,既然b指向了2的地址,所以b的值依然是2
總結:
+=對於可變對象(dict,list)來說,以最小動作為基礎,是在原處修改的
= 另外的是生成了一個新的對象
知識點:垃圾回收
1. 小整數對象池
整數在程序中的使用非常廣泛,Python為了優化速度,使用了小整數對象池, 避免為整數頻繁申請和銷毀內存空間。
Python 對小整數的定義是 [-5, 257) 這些整數對象是提前建立好的,不會被垃圾回收。在一個 Python 的程序中,所有位於這個範圍內的整數使用的都是同一個對象.
同理,單個字母也是這樣的。
但是當定義2個相同的字符串時,引用計數為0,觸發垃圾回收
2. 大整數對象池
每一個大整數,均創建一個新的對象。
3. intern機制
a1 = "HelloWorld"
a2 = "HelloWorld"
a3 = "HelloWorld"
a5 = "HelloWorld"
a6 = "HelloWorld"
a7 = "HelloWorld"
a8 = "HelloWorld"
a9 = "HelloWorld"
python會不會創建9個對象呢?在內存中會不會開辟9個”HelloWorld”的內存空間呢? 想一下,如果是這樣的話,我們寫10000個對象,比如a1=”HelloWorld”…..a1000=”HelloWorld”, 那他豈不是開辟了1000個”HelloWorld”所占的內存空間了呢?如果真這樣,內存不就爆了嗎?所以python中有這樣一個機制——intern機制,讓他只占用一個”HelloWorld”所占的內存空間。靠引用計數去維護何時釋放。
總結:垃圾回收
- 小整數[-5,257)共用對象,常駐內存
- 單個字符共用對象,常駐內存
- 單個單詞,不可修改,默認開啟intern機制,共用對象,引用計數為0,則銷毀 單詞垃圾回收
- 字符串(含有空格),不可修改,沒開啟intern機制,不共用對象,引用計數為0,銷毀
- 大整數不共用內存,引用計數為0,銷毀 大整數垃圾回收
- 數值類型和字符串類型在 Python 中都是不可變的,這意味著你無法修改這個對象的值,每次對變量的修改,實際上是創建一個新的對象 不可變
Python錯題集