12

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

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

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

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

我对弱/强类型的理解有缺陷吗?

4

4 回答 4

45

您的示例演示了动态类型,而不是弱类型。动态类型一般是指一个对象可以存储的数据类型是可变的;任何目标都可以绑定到任何类型的对象。相比之下,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 是静态的”。它更像是一个滑动比例或频谱,而不是一个二元属性。

于 2010-01-08T03:45:20.180 回答
5

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

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

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

于 2010-01-08T03:56:41.560 回答
5

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

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

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

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

我要澄清的是,每种弱类型/动态语言都以自己的方式处理这个问题。

于 2010-01-08T04:35:41.100 回答
2

是的。那不是强/弱类型,而是静态/动态类型。弱类型允许诸如5 + '5'等于 10 之类的东西。

于 2010-01-08T03:45:23.033 回答