Python是一种弱类型语言,因为变量可以切换类型吗?

con*_*sed 11 python weak-typing strong-typing

我理解它的方式,PHP中允许以下内容,因为它是一种弱类型的语言.

$var = 'Hello';
$var = 5;
Run Code Online (Sandbox Code Playgroud)

我刚刚安装了一个Windows版本的Python 2.6,我希望它不要让我像这样更改类型,但上面代码的Python等效工作就像在PHP中一样!

>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>
Run Code Online (Sandbox Code Playgroud)

我对弱/强打字的理解有缺陷吗?

Joh*_*lla 41

您的示例演示了动态类型,而不是弱类型.动态类型通常意味着对象可以存储的数据类型是可变的; 任何目标都可以绑定任何类型的对象.与C#相比,这是静态类型[*].

int i = 5; // Okay.
i = "5";   // Illegal! i can only hold integers.
Run Code Online (Sandbox Code Playgroud)

强类型意味着一旦分配了特定类型的值,对象就会遵守关于它们如何与各种类型的其他对象交互的严格规则.打字薄弱意味着这些规则更加轻松.这并不意味着强类型语言必然具有优势; 它只是一种语言设计选择.

Python被认为是强类型的,因为对象具有它们所键入的不同概念.对象之间不兼容的操作会导致错误:

>>> 1 + 1          # Add two integers.
2
>>> "1" + "1"      # Concatenate two strings.
'11'
>>> 1 + int("1")   # Add two integers.
2
>>> "1" + str(1)   # Concatenate two strings.
'11'
>>> 1 + "1"        # Undefined! Adding integers and strings is meaningless.
Traceback (most recent call last):
  File "", line 5, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)

但是在PHP中,规则对于可接受的内容更加宽松.因此,它被认为比其他语言更弱.

$x = 1 + "1"; // x is 2
Run Code Online (Sandbox Code Playgroud)

[*]从技术上讲,从C#4开始,C#是静态类型的,但是在每个绑定的基础上选择加入动态类型,这要归功于dynamic关键字.如今很多语言都在增加动态功能并模糊线条,因此越来越难以说"语言X是动态的"和"语言Y是静态的".它比滑动尺度或光谱更像是二元属性.

  • 我认为你的意思是最后一个,而不是'11'. (3认同)
  • @confused:不.你不需要静态类型的语言.Java和C#是工作中的巨大痛苦.你需要问你真正的问题(作为一个单独的问题).为什么你认为静态类型很重要?你在做什么让静态打字"看起来"如此重要? (2认同)

Anu*_*rag 5

弱类型或强类型没有真正的定义。它完全与隐式类型转换有关,与静态/动态类型无关。

像 Java 这样的静态类型语言可以是弱类型的(不是那样),而像 PHP 这样的动态类型语言可以是强类型(不是那样)。

弱类型语言在某些操作中可以混合哪些数据类型方面更加自由。

  • @Yosef你的评论似乎与这个答案完全无关(你错误地声称这是错误的)。 (2认同)

小智 5

第一个答案还有一个补充:它有点复杂,因为在python中+运算符被重载意味着它会添加(数学)和连接(粘合两个字符串).在php的例子中

$i = 1 + "1" // $i == 2
Run Code Online (Sandbox Code Playgroud)

加上(数学),因为.(点)用于连接,所以在PHP中

$i = 1 . "1" // $i == "11"
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的是,每种弱类型/动态语言都以自己的方式处理这个问题.