Python是弱类型语言吗?变量可以切换类型吗?

15 投票
5 回答
19416 浏览
提问于 2025-04-15 17:47

我理解的情况是,在PHP中,下面的做法是被允许的,因为PHP是一种弱类型语言。

$var = 'Hello';
$var = 5;

我刚安装了Windows版本的Python 2.6,我原本以为它不会像这样随便改变类型,但上面的代码在Python中也能正常工作,真让人吃惊!

>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>

我对弱类型和强类型的理解是不是有问题?

5 个回答

6

对第一个回答补充一点:

这有点复杂,因为在Python中,+这个符号被重载了,也就是说它既可以用来做加法(数学运算),也可以用来连接字符串(把两个字符串粘在一起)。

在PHP的例子中,

$i = 1 + "1" // $i == 2

加号是用来做加法的,因为在PHP中,点(.)是用来连接字符串的,所以在PHP里

$i = 1 . "1" // $i == "11"

我想说明的是,每种弱类型或动态类型的语言都有自己处理这个问题的方法。

6

其实“弱类型”和“强类型”并没有一个明确的定义。它们主要是关于隐式类型转换的,而和静态类型或动态类型没有关系。

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

弱类型语言在某些操作中对数据类型的混合比较宽松。

46

你的例子展示的是动态类型,而不是弱类型。动态类型通常意味着一个对象可以存储的数据类型是可以变化的;任何目标都可以绑定到任何类型的对象。和C#这样的静态类型语言相比就很不同了[*]。

int i = 5; // Okay.
i = "5";   // Illegal! i can only hold integers.

强类型意味着一旦给一个对象赋了特定类型的值,这个对象在与其他不同类型的对象交互时会遵循严格的规则。弱类型则意味着这些规则比较宽松。这并不意味着强类型语言在任何方面都更优秀;这只是语言设计上的一种选择。

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'

但是在PHP中,关于什么是可以接受的规则就宽松得多。因此,它被认为比其他一些语言更弱类型。

$x = 1 + "1"; // x is 2

[*] 从技术上讲,从C# 4开始,C#是静态类型的,但可以在每个绑定的基础上选择动态类型,这要归功于dynamic关键字。现在很多语言都在添加动态功能,模糊了界限,所以越来越难以说“语言X是动态的”和“语言Y是静态的”。这更像是一个滑动的尺度或光谱,而不是一个二元属性。

撰写回答