python之当变量名与函数名重名时的有趣发现。

时间:2024-04-12 12:09:15

楼主今天学习装饰器的时候发现,在python底层会把被装饰的函数地址换成装饰器里return回来的地址,那么你调用被装饰的函数时候其实是在调用装饰器return回来的地址所形成的闭包环节(如图1所示)。python之当变量名与函数名重名时的有趣发现。楼主想既然底层能把函数地址更换了,那么楼主是把函数地址换了又有何不可呢!(如图2)
python之当变量名与函数名重名时的有趣发现。运行结果(图3):
python之当变量名与函数名重名时的有趣发现。你以为这就结束了吗!!!不不不,我们再看看debug后台Variables的func(图4,图5)。
python之当变量名与函数名重名时的有趣发现。python之当变量名与函数名重名时的有趣发现。有没有发现我的fun“按道理”来说是一个变量接收了func的地址而已,没想到后台直接就把func的地址赋值给了“函数”fun,中途并没有产生一个新的fun变量。

再来一个实验,我们给fun赋值一个int值会发生什么?(图6)
python之当变量名与函数名重名时的有趣发现。python之当变量名与函数名重名时的有趣发现。图6里的fun的class直接从function变成int,从始至终没有出现过新的fun变量,仅仅把“函数”fun里的值改成了1.

结论:
你的变量最好不要和函数名重名哦,小心你的函数地址被覆盖哦。