根据我的理解,PHP 允许以下内容,因为它是一种弱类型语言。
$var = 'Hello';
$var = 5;
我刚刚安装了 Python 2.6 的 Windows 版本,我希望它不会让我像那样更改类型,但是上面代码的 Python 等效项就像在 PHP 中一样工作!
>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>
我对弱/强类型的理解有缺陷吗?
根据我的理解,PHP 允许以下内容,因为它是一种弱类型语言。
$var = 'Hello';
$var = 5;
我刚刚安装了 Python 2.6 的 Windows 版本,我希望它不会让我像那样更改类型,但是上面代码的 Python 等效项就像在 PHP 中一样工作!
>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>
我对弱/强类型的理解有缺陷吗?
您的示例演示了动态类型,而不是弱类型。动态类型一般是指一个对象可以存储的数据类型是可变的;任何目标都可以绑定到任何类型的对象。相比之下,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 是静态的”。它更像是一个滑动比例或频谱,而不是一个二元属性。
弱类型或强类型没有真正的定义。它都是关于隐式类型转换的,与静态/动态类型无关。
像 Java 这样的静态类型语言可以是弱类型的(不是这样的),像 PHP 这样的动态类型的语言可以是强类型的(不是这样的)。
弱类型语言在某些操作中可以混合哪些数据类型方面更加自由。
第一个答案的一个补充:它有点复杂,因为在 python 中 + 运算符是重载的,这意味着它会添加(数学)和连接(粘合两个字符串)。在 php 示例中
$i = 1 + "1" // $i == 2
加号加(数学),因为 . (dot) 用于连接,所以在 php
$i = 1 . "1" // $i == "11"
我要澄清的是,每种弱类型/动态语言都以自己的方式处理这个问题。
是的。那不是强/弱类型,而是静态/动态类型。弱类型允许诸如5 + '5'
等于 10 之类的东西。