【趣谈】| 编程的尽头是玄学?
一篇twitter引发的大讨论
背后到底发生了什么
编程的尽头是玄学?
一篇twitter引发的大讨论
首先声明,本人是坚定的唯物主义者,事情要从前两天Python之父的一篇twitter说起。
从理论上来说,结果应该是1, 1
对不对,但是聪明的你肯定想到事情没那么简单。以下是实际运行情况,各位可以自己尝试下。
x = 0
y = 0
def f():
x = 1
y = 1
class C:
print(x, y)
x = 2
f()
# ------------------------------------------
# result
0 1
我们都知道,代码是逐行执行的,此段代码比较简单,理论结果就应该是1 1
,事实上,如果你把x = 2
注释掉,结果是符合预期的。
与此同时我们也应该明白,此结果的出现不单单是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
背后到底发生了什么
为什么加了x = 2
,结果就出现了不同?严格意义上来讲这是错误的不应该发生。按照Python之父的说法,这个现象在Python3.9上依然存在(我运行的环境是Python3.7).
这涉及到作用域和命名空间的概念:
简单来说,x = 0, y = 0
属于全局变量,
f()函数里的x, y属于局部变量,
class C中的x属于局部变量,
如果没有x = 2
, x将继承f()函数里的x, y属于局部变量值,有了x = 2
后,在代码运行到class C的地方,
发现类里面有x的值,但是在打印前没有定义,所以它会去找全局变量替代。
所以最终的打印结果是0, 1
.
如果你再加个y = 2
最终的打印结果是0, 0
.
编程的尽头是玄学?
正所谓:遇事不决,量子力学;解释不通,穿梭时空。
但是真的有玄学吗?
是不是可以这么理解,玄学只是还未被解释的科学,科学是已经被证伪或者证实的玄学。
比如天狗食日,这一无比普通的天文现象,在古代可是了不得的大事。
所以说科学的尽头是玄学未尝不可,因为还有很多科学无法解释的事情。比如外星文明,科学尚无定论,但是玄学可以一通乱扯走在科学前面,等到科学可以证明的时候,再来分辨对错。
总结一句话:玄学是因为我们对事物的了解还不够深刻而为了让自己满足于某种答案的一种自我心理安慰。
顺便一提,这样写代码是不规范和不推荐的,容易让人产生困惑,仅供交流学习参考。
相关推荐