Python是弱类型语言吗?变量可以切换类型吗?
我理解的情况是,在PHP中,下面的做法是被允许的,因为PHP是一种弱类型语言。
$var = 'Hello';
$var = 5;
我刚安装了Windows版本的Python 2.6,我原本以为它不会像这样随便改变类型,但上面的代码在Python中也能正常工作,真让人吃惊!
>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>
我对弱类型和强类型的理解是不是有问题?
5 个回答
对第一个回答补充一点:
这有点复杂,因为在Python中,+这个符号被重载了,也就是说它既可以用来做加法(数学运算),也可以用来连接字符串(把两个字符串粘在一起)。
在PHP的例子中,
$i = 1 + "1" // $i == 2
加号是用来做加法的,因为在PHP中,点(.)是用来连接字符串的,所以在PHP里
$i = 1 . "1" // $i == "11"
我想说明的是,每种弱类型或动态类型的语言都有自己处理这个问题的方法。
其实“弱类型”和“强类型”并没有一个明确的定义。它们主要是关于隐式类型转换的,而和静态类型或动态类型没有关系。
像Java这样的静态类型语言可以是弱类型的(虽然它不是),而像PHP这样的动态类型语言也可以是强类型的(虽然它也不是)。
弱类型语言在某些操作中对数据类型的混合比较宽松。
你的例子展示的是动态类型,而不是弱类型。动态类型通常意味着一个对象可以存储的数据类型是可以变化的;任何目标都可以绑定到任何类型的对象。和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是静态的”。这更像是一个滑动的尺度或光谱,而不是一个二元属性。