虛幻5恐怖遊戲《ILL》新實機演示 氛圍令人膽寒
前言
學習Python的單例實現的時候,遇到了下面這樣的程式碼。很不理解為什麼區域性變數 _instance沒有重新初始化。後來看到有人說這是閉包,於是又去了解了下
閉包。沒想到閉包竟然是程式語言中一個通用的概念,於是深入研究了下。
def singleton(cls): _instance = {} def inner(): if cls not in _instance: _instance[cls] = cls() return _instance[cls] return inner @singleton class Cls(object): def __init__(self): pass cls1 = Cls() cls2 = Cls() print(id(cls1) == id(cls2))
閉包(Closure)
閉包是為了在函式是一等公民的程式語言中實現詞法作用域的名稱繫結的一種機制---翻譯自Wiki。估計這麼說也沒有人能看的懂。先看看一個Python閉包程式碼:
def f(x):
def g(y):
return x + y
return g # Return a closure.
a = f(1) #建立閉包
assert a(5) == 6
bar函式引用外層的foo的變數x,這個x的詞法作用域就是bar函式。但是bar中並沒有定義變數x,直譯器只能向上找外層函式(enclosing function)的x。建立閉包的時候,會給X繫結一個值。這就是定義的由來。可見一個完整的閉包由一個函式和這個函式所處的上下文構成,這個上下文包含了對閉包函式內部自由變數的定義,如圖2-1。這個自由變數的生命週期是從建立閉包開始到銷燬閉包結束,不同於一般函式區域性變數的作用域。f(x) = x + y 中的變數y就是一個自由變數,這個變數的值是多少不是在函式f中給出的。
參考
1.https://zhuanlan.zhihu.com/p/37534850
2.https://en.wikipedia.org/wiki/Closure_(computer_programming)
3.https://zhuanlan.zhihu.com/p/37534850
4.https://goldengrape.github.io/posts/python/Lambda_Tutorials/mian-xiang-yan-ke-yi-sheng-de-lyan-suan-ru-men-jiao-cheng-3/ 很好的lambda演算入門,看完就明白什麼是自由變數和繫結變量了
5.https://en.wikipedia.org/wiki/Free_variables_and_bound_variables
6.https://en.wikipedia.org/wiki/Name_binding
7.https://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scope 解釋了什麼是詞法作用域