我只是在玩python并意识到一些奇怪的东西。
我有以下功能:
def myfun(): #f1
return 1
def myfun(): #f2
return 0
print (myfun())
我更改了f1
和f2
中的值,但仍然总是打印f2
的返回值。有具体原因吗?
答案 0 :(得分:4)
在编译语言中,如果尝试定义两个具有相同名称的函数,通常会收到错误消息。但是在Python中,函数是第一类对象,它们是动态定义的。
当您定义一个与之前定义的函数同名的新函数时,函数名称现在绑定到新的函数对象,垃圾收集器将回收旧的函数对象。
因此,您的函数发生的情况与本页其他答案中发布的简单整数示例所发生的情况没有什么不同。
同样,我们可以使用lambda
机制定义的函数执行相同的操作。例如:
>>> myfun=lambda:1; myfun=lambda:0; print(myfun())
0
答案 1 :(得分:0)
为什么这很奇怪?第二个函数声明会覆盖第一个函数声明,因此在调用print
时只存在f2
。
答案 2 :(得分:0)
第二个定义导致名称myfun
绑定到其函数,替换前一个定义生成的绑定。这与以下内容完全相同:
a = 1
a = 0
print a
答案 3 :(得分:0)
这就是调用overriding
的内容。当您声明第二个函数时,第一个函数会被第二个函数覆盖。
就像你定义为例子
a=1
a=2
然后
a
将有2作为其最终价值。