Python数据类型,可变数据类型与不可变数据类型

Python3有6个标准数据类型,分别是

  1. Number
  2. String
  3. Tuple
  4. List
  5. Set
  6. Dictionary

三个可变数据类型(List、Dictionary、Set)
三个不可变数据类型(Number、String、Tuple)

以下内容主要内容参考至Python的可变与不可变数据类型,做了一点点变动,大家可以直接查看该文章。

摘取一位网友评论:
对于不可变类型,变量(引用)指向的地址的内容是不可变的,改变变量的值只是将变量(引用)指向了新的地址。
对于可变类型,变量(引用)指向的地址的内容是可变的,除非重新赋值,否则对变量的改变都是对原地址内容的改变。

以Number中的Int类型为例来观察不可变类型:

>>> x = 1
>>> id(x)
28832088
>>> y = 1
>>> id(y)
28832088
>>> x = 2
>>> id(x)
28832064
>>> y = x
>>> id(y)
28832064
>>> z = 4
>>> id(4)
28832016
>>> x += 2
>>> id(x)
28832016
>>> import gc
>>> del x,z
>>> gc.collect()
0
>>> id(4)
28832016

上面这段程序都是对不可变数据类型中的int类型的操作,id()查看的是当前变量的地址值。我们先来看x = 1和y = 1两个操作的结果,从上面的输出可以看到x和y在此时的地址值是一样的,也就是说x和y其实是引用了同一个对象,即1,也就是说内存中对于1只占用了一个地址,而不管有多少个引用指向了它,都只有一个地址值,只是有一个引用计数会记录指向这个地址的引用到底有几个而已。当我们进行x = 2赋值时,发现x的地址值变了,虽然还是x这个引用,但是其地址值却变化了,后面的y = x,使得x、y都引用了同一个对象,即2,所以地址值都是一样的。当给z赋值4时,又创建了一个新的对象4,及不管是直接赋值的4(z = 4),还是通过运算的出的4(x += 2)都指向同一内存地址。
同时还需要注意,在python程序运行时,可以主动回收变量(del x),但对象4所占用的内存,什么时候回收还不一定(比如上面的,虽然对象x,z已被删除,但对象4所占用的内存一直未释放),这个需要进一步尝试。

不可变数据类型可以理解为x引用的内存地址处的值是不能被改变的,也就是28832088地址处的值在没被垃圾回收之前一直都是1,不能改变,如果要把x赋值为2,那么只能将x引用的地址从28832088变为28832064,相当于x = 2这个赋值又创建了一个对象,即2这个对象,然后x、y都引用了这个对象,所以int这个数据类型是不可变的,如果想对int类型的变量再次赋值,在内存中相当于又创建了一个新的对象,而不再是之前的对象。

关于不可变数据类型,大家直接参考Python的可变与不可变数据类型

参考:
Python的可变与不可变数据类型

猜你喜欢

转载自blog.csdn.net/BurningSilence/article/details/107657019