文章目录

  • 变量与对象
  • 引用关系
  • 共享关系
  • 对象的垃圾回收


变量与对象

引用关系

Python属于动态数据类型语言,其数据处理方式与C、C++、Java等语言不同,C、C++、Java等要求变量在定义之前必须声明数据类型,而Python在创建变量时没有数据类型的概念,变量在第一次赋值时被创建,再次出现时为直接引用,数据类型属于对象,类型决定了对象在内存中的存储方式,变量引用对象。

python 根据参数动态实例化不同的类 python动态变量_赋值


>>> x = 5 # 第一次赋值,创建变量x,引用对象5
>>> print(x+5) # 再次使用变量x, 变量x被对象5替代进行实际运算
10

共享关系

如果再继续创建一个变量y也赋值为5,会发现变量x和变量y是对同一个对象进行了引用,这个称为对象的共享引用,如图所示:

python 根据参数动态实例化不同的类 python动态变量_Python_02

可以使用id()函数返回变量x和变量y的内存地址,示例代码如下:

>>> x = 5
>>> y = 5
>>> print(id(x)) # id()函数返回所引用对象的内存地址
2155391969712
>>> print(id(y))
2155391969712

通过id()函数的返回值不难看出变量x和变量y所引用的对象的内存地址是同一个,也可以使用身份运算符is来测试变量x和变量y的关系,示例代码如下:

>>> x = 5
>>> y = 5
>>> print(x is y)
True # 返回值为True,表名变量x和变量y其实引用的是同一个对象

除此之外,还可以可以使用多目标赋值,将多个变量引用同一个对象,示例代码如下:

>>> x = y = z = 10
>>> print(x,y,z)
>>> print(id(x))
>>> print(id(y))
>>> print(id(z))
2265577515440
2265577515440
2265577515440

通过id()函数测试可以看出通过多目标赋值,变量x、y、z引用的是同一个内存地址的对象,此时对象10是被这三个变量共享引用的。还有另外一种赋值方法也可以达到共享引用的效果,示例如下:

>>> x = 20
>>> y = x
>>> print(x,y)
>>> print(id(x))
>>> print(id(y))

对象的垃圾回收

Python为每一个对象创建一个计数器,记录对象被引用的次数,叫作引用计数。例如:当对象5被变量x和变量y同时引用时,对象5在内存中的引用计数就等于2。当引用计数为0的时候,也就是该对象没有被任何变量引用时就会被内存回收机制自动回收,这就是Python的自动内存回收机制。因此,在使用Python语言编写程序时不需要考虑对象的回收问题。

Python提供了del语句可以删除定义好的变量,释放其占用的内存空间。del语句的语法如下:

del 变量名

示例如下:

>>> name = 'lilei'
>>> del name # 删除变量