在研究C#时我发现它很奇怪,动态类型的Python会在以下代码中出现错误:
i = 5
print i + " "
Run Code Online (Sandbox Code Playgroud)
而静态类型的C#通常会进行类似的代码:
int i = 5;
Console.Write(i + " ");
Run Code Online (Sandbox Code Playgroud)
我希望有其他方法(在python中,我可以在没有任何强制转换的情况下执行此操作,但C#将要求我将int转换为string或string转换为int).
只是为了强调,我不是在问什么语言更好,我很好奇是用这种方式实现语言的原因是什么.
Eri*_*ert 23
你是对的,这里的事情很奇怪.奇怪的是,这+意味着任何一种语言的字符串连接!是否+可以将int连接到字符串上是一个小点,与+意味着"连接" 的奇怪性相比.
我不知道哪种语言首先被允许+用于表示字符串连接,但是这种错误一再被重复,所以现在我们通常甚至都没有注意到它是多么奇怪.让我们列出正常添加的一些属性,看看字符串是否正常.
四分之一不好.字符串连接与添加非常不同,那么它们为什么要共享一个运算符呢?
我不经常说这个,但C说得对.字符串连接运算符应该只是:连接.用C "X" "Y"表示"XY".如果你把两个字符串文字放在一起,它们会连接成第三个.
这实际上不是静态与动态类型的区域.相反,它是强类型与弱类型(至少根据一些常用的术语,维基百科也恰好在其编程语言的表征中使用).C#和Python都是强类型的(按照定义).
遗憾的是,所有这些概念都不是黑白的,而是灰度级的,并且定义不明确.然而,结果是,有一种语言是多么强烈进行类型检查的细微差别,并且其检查它执行.
恰巧在你的特殊情况下,C#会重载operator +字符串和数字(实际上是任意对象),而Python则没有.在这种情况下,这可以说使Python稍微严格一些.
这不是一个静态/动态的问题,而是语言设计哲学的问题.
在Python中,+被定义为数字的加法和字符串的连接.如果您有一点编程经验,这是非常合理的行为.
但是当你有一个时,会发生什么?它是否尝试将字符串转换为数字,还是将数字转换为字符串?对于任何完成任何编程的人来说,这两者都是完全合理的行为,但由于不同的语言对于这种情况的发生方式有不同的规则,因此根据您使用的语言,您可能会做出与其他人不同的假设.已经.
Python的指导原则之一是"显式优于隐式"(import this),因此它可以明确说明您想要的行为.怎么样?当然,通过将字符串或数字转换为所需的类型.然后它们都是字符串或两个数字,行为是显而易见的.
生成的代码更容易阅读(即使你不太了解Python),因为你不必猜测它会做什么.