摘要:外部作用域變量,常見于閉包函數,也就是嵌套函數中的上一層函數變量。其生命周期在整個閉包函數結束時會被釋放。該函數的返回值必須是內嵌函數名閉包函數可以大幅提高代碼復用性,使得代碼性能大幅提高。
閱讀本文大約需要 7 分鐘。1.說一下 Python 中 LEGB 是什么
LEGB 指的是 Python 中的變量作用域問題,其中
L:local 局部變量,僅存在函數內部,其存儲位置位于棧中,其生命周期在函數結束時就會被釋放。
E:enclosing 外部作用域變量,常見于閉包函數,也就是嵌套函數中的上一層函數變量。其生命周期在整個閉包函數結束時會被釋放。
G:global 全局變量,作用于整個程序,其存儲位置位于全局數據區中,其生命周期在程序銷毀時就被釋放。
B:builtins 內建模塊變量,其存儲于內置變量命名空間。
變量查找順序:
L-E-G-B
2.解釋一下 Python 中的閉包函數示例:
def func(): a = b = 1 def internal_func(c): if a+b == c: print("True") else: print("False") test = func() test(2) # 結果為 True
閉包函數作為函數式編程中的一種,當含有以下幾點時,便可稱它為一個閉包函數。
該函數是一個嵌套函數。
內嵌函數必須引用外部函數的變量。
該函數的返回值必須是內嵌函數名
閉包函數可以大幅提高代碼復用性,使得代碼性能大幅提高。
3.說一下 Python 中的深拷貝,淺拷貝,如何自己實現深拷貝
淺拷貝
copy 模塊下的 copy() 方法,實現一個對象的淺拷貝,list 下的分割也是一種淺拷貝,
示例:
import copy a = [1, 2, [3, 4]] b = copy.copy(a) a == b a is b # 結果為 True,False e = [1, 2, [3, 4]] f = e[2] h = e[2][:] f == h f is h # 結果為 True,False
淺拷貝只會拷貝對象的第一層引用,如果是復合類型,如 list 里面嵌套 list,則當內嵌 list 發生變化時,經過淺拷貝出來的對象,也會發生變化。
示例:
import copy a = [1, 2, [3, 4]] b = copy.copy(a) a == b a is b # 結果為 True,False c = copy.copy(a) a[1] = 0 print(a) print(c) # 結果為 a = [1, 0, [3, 4]], c = [1, 2, [3, 4]] a[2].append(5) print(a) print(c) # 結果為 a = [1, 0, [3, 4, 5]], c = [1, 2, [3, 4, 5]]
深拷貝
深拷貝將拷貝對象里所有引用全部拷貝,生成一個全新的對象。
示例:
import copy a = [1, 2, 3, 4] b = copy.deepcopy(a) a == b a is b # 結果為 True,False
深、淺拷貝會根據拷貝對象的數據類型,決定是否開辟新的內存空間來存放拷貝出來的新對象。
import copy a = [1, 2, 3, 4] # list 可變類型 b = copy.copy(a) a == b a is b # 結果為 True,False c = (1, 2, 3, 4) # tuple 不可變類型 d = copy.copy(c) e = copy.deepcopy(c) c == d c is d c is e # 結果為 True,True, True
自己實現深拷貝
[深拷貝源碼分析](),先占坑,還未寫。
4.說一說 Python 中的可變、不可變類型Python 中通過將對象進行 HASH 來判斷該對象是哪種類型,可 HASH 的為不可變類型,不可 HASH 的為可變類型。其中常見的幾種如下所示:
? 可變類型:List,dict,set
? 不可變類型:int,float,string,tuple,frorzenset
也可通過是否含有__hash__()方法,判斷該對象為何種類型,擁有該方法的為不可變類型,相反為可變類型。
5.說一說 Python 中一個類的實例從創建到刪除的過程首先通過類的魔法方法__new__()來創建一個實例,再通過魔法方法__init__()來對這個實例初始化,最終刪除一個實例時,Python 根據該實例的「引用計數」來判斷是否釋放該實例所占用的內存,當該實例的引用計數為 0 時,__del__()方法才會被調用,__del__()方法的不等同于del。
6.什么是單例,如何實現單例是指一個類的實例有且只有一個。一般在一個類只需要使用一次之后便不在使用時使用。
實現方式:
使用__new__()方法
class Singleton(): is_instance = None def __new__(cls): if not cls.is_instance: cls.is_instance = super().__new__(cls) return cls.is_instance return cls.is_instance s = Singleton() g = Singleton() print(s is g) # 結果為 True
使用裝飾器
def Singleton01(cls): is_instance = {} def get_instance(*args, **kwargs): if not is_instance: is_instance[cls] = cls() return is_instance[cls] return is_instance[cls] return get_instance @Singleton01 class Myclass(): pass s = Myclass() g = Myclass() print(s is g) # 結果為 True
多線程下實現單例
class Singleton02(): is_instance = None is_lock = threading.Lock() def __new__(cls): with cls.is_lock: if not cls.is_instance: cls.is_instance = super().__new__(cls) return cls.is_instance return cls.is_instance s = Singleton() g = Singleton() print(s is g) # 結果為 True
多線程優化
class Singleton03(): is_instance = None is_lock = threading.Lock() def __new__(cls): # 單例判斷提前,只在第一次判斷時加鎖,避免無意義的加鎖解鎖 if not cls.is_instance: with cls.is_lock: cls.is_instance = super().__new__(cls) return cls.is_instance return cls.is_instance s = Singleton03() g = Singleton03() print(s is g) # 結果為 True
未寫完,下一次更新補上
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45114.html
摘要:定時檢測器定時拿出一部分重新的用過濾器進行檢測剔除不能用的代理。重載是讓類以統一的方式處理不同類型數據的一種手段。雖然在內存中存儲表數據確實會提供很高的性能,但當守護進程崩潰時,所有的數據都會丟失。第1題: 如何解決驗證碼的問題,用什么模塊,聽過哪些人工打碼平臺? PIL、pytesser、tesseract模塊 平臺的話有:(打碼平臺特殊,不保證時效性) 云打碼 掙碼 斐斐打碼 若快打碼...
摘要:定時檢測器定時拿出一部分重新的用過濾器進行檢測剔除不能用的代理。重載是讓類以統一的方式處理不同類型數據的一種手段。雖然在內存中存儲表數據確實會提供很高的性能,但當守護進程崩潰時,所有的數據都會丟失。第1題: 如何解決驗證碼的問題,用什么模塊,聽過哪些人工打碼平臺? PIL、pytesser、tesseract模塊 平臺的話有:(打碼平臺特殊,不保證時效性) 云打碼 掙碼 斐斐打碼 若快打碼...
摘要:說一下是怎樣將數據持久化的為某一時刻下的數據庫里的內容拍一張照片快照,并將該照片寫進磁盤中,實現數據持久化。通過寫命令,將數據追加到文件末尾,實現數據持久化。至此,有關數據庫知識點的面試題就已告一段落,下次更新網絡通信方面面試題。 1.說一說 Redis 是什么 Redis 是一種「Key-Value」的內存型、非關系型數據庫,屬于 NoSQL 的一種。 Redis 的讀寫速度特別快,...
摘要:說一下是怎樣將數據持久化的為某一時刻下的數據庫里的內容拍一張照片快照,并將該照片寫進磁盤中,實現數據持久化。通過寫命令,將數據追加到文件末尾,實現數據持久化。至此,有關數據庫知識點的面試題就已告一段落,下次更新網絡通信方面面試題。 1.說一說 Redis 是什么 Redis 是一種「Key-Value」的內存型、非關系型數據庫,屬于 NoSQL 的一種。 Redis 的讀寫速度特別快,...
閱讀 2344·2021-11-11 16:54
閱讀 2596·2021-09-26 09:47
閱讀 3977·2021-09-08 09:36
閱讀 2727·2021-07-25 21:37
閱讀 927·2019-08-30 15:54
閱讀 2540·2019-08-30 14:22
閱讀 3245·2019-08-30 13:57
閱讀 2558·2019-08-29 17:17