Python 语言的一个突出特点是它是一种动态类型的语言。而基于编译器的语言如 C/C++、Java 等则是静态类型语言。让我们试着理解静态类型和动态类型之间的区别。
静态类型 vs 动态类型
在静态类型语言中,每个变量及其数据类型必须在赋值前声明。如果试图赋予其他类型的值,则编译器会报编译错误。
我们来看下面的一段 Java 程序:
public class MyClass {
public static void main(String args[]) {
int var;
var="Hello";
System.out.println("Value of var = " + var);
}
}
这里,var
被声明为整型变量。当我们尝试给它赋一个字符串值时,编译器会给出以下错误信息:
/MyClass.java:4: error: incompatible types: String cannot be converted to int
x="Hello";
^
1 error
为什么说 Python 是动态类型?
在 Python 中,变量只是一个标签,或者说是内存中存储的对象的引用,并不是一个命名的内存位置。因此不需要预先声明类型。因为这只是个标签,所以它可以指向任何类型的对象。
在 Java 中,变量的类型决定了它可以存储什么,不可以存储什么。而在 Python 中,情况则相反。在这里,数据的类型(即对象)决定了变量的类型。首先,让我们存储一个字符串在变量 var
中,并检查其类型:
>>> var="Hello"
>>> print ("id of var is ", id(var))
id of var is 2822590451184
>>> print ("type of var is ", type(var))
type of var is <class 'str'>
因此,var
是字符串类型。然而,它并不是永久绑定的。它只是一个标签;可以被赋值为任何其他类型的对象,比如说一个浮点数,这将会以不同的 id()
存储:
>>> var=25.50
>>> print ("id of var is ", id(var))
id of var is 2822589562256
>>> print ("type of var is ", type(var))
type of var is <class 'float'>
或者是元组。此时 var
标签坐在了一个不同的对象上:
>>> var=(10,20,30)
>>> print ("id of var is ", id(var))
id of var is 2822592028992
>>> print ("type of var is ", type(var))
type of var is <class 'tuple'>
我们可以看到每当 var
指向一个新的对象时,它的类型都会改变。这就是为什么 Python 被称为动态类型语言的原因。
Python 的动态类型特性使其相比 C/C++ 和 Java 更加灵活。但是,这也可能导致运行时错误,因此程序员需要小心。