Python 动态类型

动态类型

  对象是储存在内存中的实体,我们并不能直接接触到该对象。程序中的变量,是对象的一个引用。

  引用和对象分离,是动态类型的核心。引用可以随时指向一个新的对象。

>>> a = 'ABC'
>>> b = a
>>> a = 'XYZ'
>>> a,b
  • a = 'ABC',引用 a 指向内存中的字符串对象 'ABC' 。

  • b = a,引用 b 也指向对象 'ABC'  。

  • a = 'XYZ',引用 a 指向内存中的字符串对象 'XYZ' 。

此时,引用 a 不再指向对象 'ABC',引用 b 仍指向对象 'ABC' 。可以通过内置函数 id() 查看对象的内存地址进行验证。

  我们再看另外一种情况:

>>> L1 = [1,2,3]
>>> L2 = L1
>>> L1[0] = 10
>>> L1,L2

  • L1,L2的引用没有发生变化,依然指向那个列表对象。

  • 列表元素 L1[0] 进行重新赋值操作,改变的是该元素对象的引用,对列表对象的引用没有影响。

  • 能够改变对象自身,且存放对象的内存地址不会改变的数据类型,称为可变数据类型。包括列表、字典和集合。

  • 不能改变对象自身,或改变对象自身后,存放对象的内存地址发生改变的数据类型,称为不可变数据类型。包括数字、字符串和元组。

浅拷贝和深拷贝

  • 深拷贝指的是复制内容,单独开辟一个内存地址。

  • 浅拷贝指的是两个变量同时指向一个内存地址。

>>> import copy
>>> x = [1,2,3]
>>> a = copy.copy(x)    # 深拷贝
>>> x == a
True
>>> x is a
False
>>> y = '123'
>>> b = copy.copy(y)    # 浅拷贝
>>> y == b
True
>>> y is b
True
>>> c = x[:]    # 深拷贝 
posted @ 2019-05-12 10:30  PIPO2  阅读(487)  评论(0编辑  收藏  举报