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

时间:2010-01-08 03:43:07

标签: python strong-typing weak-typing

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

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

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

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

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

4 个答案:

答案 0 :(得分:40)

您的示例演示了动态输入,而不是弱输入。动态类型通常意味着对象可以存储的数据类型是可变的;任何目标都可以绑定任何类型的对象。与C#相比较,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是静态的”。它比滑动尺度或光谱更像是二元属性。

答案 1 :(得分:5)

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

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

加号(数学)因为。 (点)用于连接,所以在php

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

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

答案 2 :(得分:4)

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

像Java 这样的静态类型语言可以弱类型(不是那样),并且像这样的动态类型语言可以强类型化(不是它的类型) )。

弱类型语言在某些操作中可以混合使用哪种数据类型更为自由。

答案 3 :(得分:2)

是。这不是强/弱打字,即静态/动态打字。弱键入允许诸如5 + '5'之类的东西等于10。