【趣談】| 編程的盡頭是玄學(xué)?


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