【趣談】| 編程的盡頭是玄學?


一篇twitter引發(fā)的大討論
背后到底發(fā)生了什么
編程的盡頭是玄學?
一篇twitter引發(fā)的大討論
首先聲明,本人是堅定的唯物主義者,事情要從前兩天Python之父的一篇twitter說起。
從理論上來說,結(jié)果應該是1, 1對不對,但是聰明的你肯定想到事情沒那么簡單。以下是實際運行情況,各位可以自己嘗試下。
x?=?0
y?=?0
?
?
def?f():
????x?=?1
????y?=?1
????class?C:
????????print(x,?y)
????????x?=?2
f()
#?------------------------------------------
#?result
0?1
我們都知道,代碼是逐行執(zhí)行的,此段代碼比較簡單,理論結(jié)果就應該是1 1,事實上,如果你把x = 2注釋掉,結(jié)果是符合預期的。
與此同時我們也應該明白,此結(jié)果的出現(xiàn)不單單是x = 2的影響,而應該是x = 2和class C的共同作用。
x?=?0
y?=?0
?
?
def?f():
????x?=?1
????y?=?1
????class?C:
????????print(x,?y)
????????#?x?=?2
f()
#?------------------------------------------
#?result
1?1
背后到底發(fā)生了什么
為什么加了x = 2,結(jié)果就出現(xiàn)了不同?嚴格意義上來講這是錯誤的不應該發(fā)生。按照Python之父的說法,這個現(xiàn)象在Python3.9上依然存在(我運行的環(huán)境是Python3.7).
這涉及到作用域和命名空間的概念:
簡單來說,x = 0, y = 0屬于全局變量,
f()函數(shù)里的x, y屬于局部變量,
class C中的x屬于局部變量,?
如果沒有x = 2, x將繼承f()函數(shù)里的x, y屬于局部變量值,有了x = 2后,在代碼運行到class C的地方,
發(fā)現(xiàn)類里面有x的值,但是在打印前沒有定義,所以它會去找全局變量替代。
所以最終的打印結(jié)果是0, 1.
如果你再加個y = 2最終的打印結(jié)果是0, 0.
編程的盡頭是玄學?
正所謂:遇事不決,量子力學;解釋不通,穿梭時空。
但是真的有玄學嗎?
是不是可以這么理解,玄學只是還未被解釋的科學,科學是已經(jīng)被證偽或者證實的玄學。
比如天狗食日,這一無比普通的天文現(xiàn)象,在古代可是了不得的大事。
所以說科學的盡頭是玄學未嘗不可,因為還有很多科學無法解釋的事情。比如外星文明,科學尚無定論,但是玄學可以一通亂扯走在科學前面,等到科學可以證明的時候,再來分辨對錯。
總結(jié)一句話:玄學是因為我們對事物的了解還不夠深刻而為了讓自己滿足于某種答案的一種自我心理安慰。
順便一提,這樣寫代碼是不規(guī)范和不推薦的,容易讓人產(chǎn)生困惑,僅供交流學習參考。
相關(guān)推薦
