我目前正在学习python,之前我从事C ++工作。今天,我正在观看有关Python概念的教程,并且看到了这段代码,尽管该代码在Python上可以正常工作,但根据我(或坦率地说,根据C ++)应该给出了错误。
这是C ++代码,它会显示错误:(请首先检查下面的输出)
#include<iostream>
int doMath(int a, int b){
return a+b;
}
int doMath(int c, int d){
return c*d;
}
int main(){
std::cout<<doMath(3,4);
return 0;
}
输出:
在函数'int doMath(int,int)':
错误:在第9行重新定义'int doMath(int,int)'
注:先前在第5行定义的'int doMath(int,int)'
===构建失败:1个错误,0个警告(0分钟,0秒)===
这是等效的Python代码:(请首先查看下面的输出)
def doMath(a,b):
return a+b
def doMath(c,d):
return c*d
def main():
print(doMath(3,4))
if __name__ == "__main__": main()
输出:
12
处理完成,退出代码为0
那么python为什么要自己选择doMath()
的第二顺序函数定义?它怎么能自己决定我要第二个定义而不是第一个?为什么它允许使用相同名称和相同数量参数的多个定义????
或更准确地说,可能是问题,为什么我们不能像在C ++中那样编译Python代码(至少不使用PyCharm或我所知的其他代码?)
因为如果可以的话,它会首先编译并确定一个名称下有两个具有相同数量参数的函数定义,因此根本无法运行。与老式的C相同。我目前正在学习python,之前我从事C ++工作。今天,我正在观看有关Python概念的教程,并且看到了这段代码,尽管该代码在Python上可以正常使用,但根据...
它们是非常不同的语言,所以它们的行为有所不同。
Python是一种基于脚本的语言,这意味着无需编译,只需实时执行代码即可。当您在Python中“定义”函数时,可以认为它是将函数分配给名称。当您要调用该函数时,可以调用以该名称存储的函数。如果重新定义该函数,则将覆盖该名称。这与C ++不同,在C ++中,代码是提前编译的。 C ++一次编译所有函数,这意味着第二个doMath
声明将导致模棱两可的调用。另一方面,Python随即声明函数。如果您重新分配doMath
,该脚本将仅调用其最新定义。要回答您的问题“为什么?”:好的,这就是Python设计的工作方式。此设计具有许多优点,例如,如果您想根据上下文更改函数的行为。 Python也有缺点,例如需要一个解释器才能运行(因为,正如您提到的,我们无法编译Python)。如果您希望获得与“老式C相同的行为”,请使用C。不同的语言具有不同的怪癖,这些怪癖在不同的应用程序中可能会更好。