python是一种弱类型声明的语言,因此在定义变量时不需要声明类型。
先不说那么多,我们先定义两个变量
a = 3 # 定义变量a,并把3赋值给它
b = 4 # 定义变量b,并把4赋值给它
c = 'new_str' # 定义变量c,将一个字符串赋值给它
学过python的同学可能一直以来都是这么写的,但是对于很多以前学过java,c++的同学来说,可能会有疑问,为什么在定义a,b,c这三个变量时没有声明类型呢,它们是怎么判断值的类型的呢?
其实,这里就体现出python是一种‘动态’的语言,动态类型是python非常重要的一个概念,其实在python中我们虽然把3,‘new_str’这些值称作”变量“,实际上他们在python中都是一个个对象,那么他们是谁的对象呢?我们通过代码来看一下:
print(isinstance(3, int)) # True
print(isinstance(4, int)) # True
print(isinstance('new_str', str)) # True
这里isinstance(a, b) 函数实际上用于验证a是否是b的对象,如果是的话返回true,这里显然,3和4是int(整型)类的对象,‘new_str’ 是str(字符串)类的对象
我们知道类的每一个对象实际上都是内存中的一块独立的区域 ,我们在调用他们的时候通过的方式只能是引用,所以实际上python中变量的声明并不是直接将值和变量名,实际上是将变量的内存地址与变量名绑定,并且引用随时可以指向一个新的对象,接下来我们来看一下变量创建的步骤并且改变变量的引用:
a = 3
# 以 a = 3 为例
# 1. 在内存中创建 ‘3’ 这个整型类的对象(有独立的空间)
# 2.将 a 这个名称指向 a 在内存中的地址
b = a
# 将 b 也指向 a ,这时候实际上 b 和 a 没有关系,在本质上是 b 指向 ‘3’ 这个对象
b = 7
# 将 b 的引用改变,使它不再指向 3 ,实际上这里又重复了前两个步骤
所以总结一下上面讲的内容:为什么说python是一种弱类型声明的语言呢,因为在python定义变量时,并不是直接将变量值与变量名绑定,而是将变量值的地址与变量名绑定,这与其他很多语言例如c++不同,这也造就了python语言天生的多态(后面会讲到多态的概念),python的变量名只是一个标识符,并不占有内存空间,只是用于代指内存中的一块区域,这块区域里面存放着“变量的地址”,注意是变量的地址而不是变量本身,下面用图来说明(自己手画的)
注:上边b指向的地址尾数0 变成 3
补充一下,有些同学可能对上面的堆和栈不怎么了解,我们现在简单理解一下:系统帮忙处理的就是栈,堆中具体存放的内容由程序员来设置,就好像我们将40赋值给变量a,40是我们输入的值,放在堆中,栈中的存储则是系统帮我们进行处理