14 | 答疑(一):列表和元組的內部實現是怎樣的?

 

目錄

 

1.列表和元組的內部實現

2.爲什麼在舊哈希表中,元素會越來越稀疏。

3.有關異常的困擾

4.關於多態和全局變量的修改


1.列表和元組的內部實現

答:它和list相似,本質也是一個array,但是空間大小固定,不同於一般array,python的tuple做了許多優化,來提高在程序中的效率。如,當tuple的大小不超過20時,python就會把它緩存在內部的一個free list中,這樣,如果你以後需要去創建現樣的tuple,python就可以直接從緩存中載入,提高程序運行效率。

2.爲什麼在舊哈希表中,元素會越來越稀疏。

答:在例子中對比,可以看到新哈希表中的空間利用率,相比於舊哈希有大的提升。

3.有關異常的困擾

e = 1
try:
    1 / 0
except ZeroDivisionError as e:
    try:
        pass
    finally:
        del e

e開始指向整數1,但是except block結束時被刪除(dele),所以會的“NameErroe”,所以在寫代碼時,一定要保證except中異常賦予的變量,在之後有語句中不再被用到。

4.關於多態和全局變量的修改

(1)python自己判斷的多態和子類繼承的多態Polymorphism是否相同

答:多態是指多種不同的形態,因此,判斷類型是多態還是子類繼承的多態,在本質上是一樣的,只不過可以把它們理解爲兩tkhi同的表現形式。

(2)函數內部不能直接用+=修改全局變量,但對於list全局變量,卻可以使用append、extend之類修改?

答:全局變量指向對象不可變是,比如整型、字符串,如果嘗試在函數內部改變它的值,卻不加關鍵字global,就會拋出異常。

x = 1

def func():
    x += 1
func()
x

## 輸出
UnboundLocalError: local variable 'x' referenced before assignment

這是因爲程序默認函數內部的x是局部變量,而你沒有爲其賦值就直接引用,顯然不可行,不過,如果全局變量指向的對象是可變的,比如列表、字典等,就可以在函數內部修改。

x = 1

def func():
    x += 1
func()
x

## 輸出
UnboundLocalError: local variable 'x' referenced before assignment

注意的是,x.append(2),並沒有改變變量x,x依然指向原來的列表。這句的意思是,訪問x指向的列表,並在這個列表的末尾加2.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章