Python数据类型,可变数据类型与不可变数据类型
Python3有6个标准数据类型,分别是
- Number
- String
- Tuple
- List
- Set
- 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的可变与不可变数据类型。
本文地址:https://blog.csdn.net/shaozhulei555/article/details/107643141
上一篇: Python数据类型: 集合类型