con*_*sed 11 python weak-typing strong-typing
我理解它的方式,PHP中允许以下内容,因为它是一种弱类型的语言.
$var = 'Hello';
$var = 5;
Run Code Online (Sandbox Code Playgroud)
我刚刚安装了一个Windows版本的Python 2.6,我希望它不要让我像这样更改类型,但上面代码的Python等效工作就像在PHP中一样!
>>> var = "Hello"
>>> type(var)
<type 'str'>
>>> var = 5
>>> type(var)
<type 'int'>
Run Code Online (Sandbox Code Playgroud)
我对弱/强打字的理解有缺陷吗?
Joh*_*lla 41
您的示例演示了动态类型,而不是弱类型.动态类型通常意味着对象可以存储的数据类型是可变的; 任何目标都可以绑定任何类型的对象.与C#相比,这是静态类型[*].
int i = 5; // Okay.
i = "5"; // Illegal! i can only hold integers.
Run Code Online (Sandbox Code Playgroud)
强类型意味着一旦分配了特定类型的值,对象就会遵守关于它们如何与各种类型的其他对象交互的严格规则.打字薄弱意味着这些规则更加轻松.这并不意味着强类型语言必然具有优势; 它只是一种语言设计选择.
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'
Run Code Online (Sandbox Code Playgroud)
但是在PHP中,规则对于可接受的内容更加宽松.因此,它被认为比其他语言更弱.
$x = 1 + "1"; // x is 2
Run Code Online (Sandbox Code Playgroud)
[*]从技术上讲,从C#4开始,C#是静态类型的,但是在每个绑定的基础上选择加入动态类型,这要归功于dynamic关键字.如今很多语言都在增加动态功能并模糊线条,因此越来越难以说"语言X是动态的"和"语言Y是静态的".它比滑动尺度或光谱更像是二元属性.
弱类型或强类型没有真正的定义。它完全与隐式类型转换有关,与静态/动态类型无关。
像 Java 这样的静态类型语言可以是弱类型的(不是那样),而像 PHP 这样的动态类型语言可以是强类型(不是那样)。
弱类型语言在某些操作中可以混合哪些数据类型方面更加自由。
小智 5
第一个答案还有一个补充:它有点复杂,因为在python中+运算符被重载意味着它会添加(数学)和连接(粘合两个字符串).在php的例子中
$i = 1 + "1" // $i == 2
Run Code Online (Sandbox Code Playgroud)
加上(数学),因为.(点)用于连接,所以在PHP中
$i = 1 . "1" // $i == "11"
Run Code Online (Sandbox Code Playgroud)
我想弄清楚的是,每种弱类型/动态语言都以自己的方式处理这个问题.