Python可变与不可变数据类型的区别?

问答Python可变与不可变数据类型的区别?
1
水中的鱼 asked 10月 ago

Python可变与不可变数据类型的区别?

2 Answers
1
帅哥 你好. answered 10月 ago

Python中看可变与不可变数据类型,主要是看变量所指向的内存地址处的值是否会改变 。 Python 的六种标准数据类型:数字、字符串、列表、元组、字典、集合。
不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组)。
可变数据(3个):List(列表)、Dictionary(字典)、Set(集合)。
 
下面分别来说说这两者的具体区别:
1、可变数据类型
可变数据类型:变量所指向的内存地址处的值是可以被改变的 。
使用可变数据类型中的列表 list 为例:

>>> a = [1, 2, 3]
>>> id(a)
41568816  
>>> a = [1, 2, 3]
>>> id(a)
41575088  
>>> a.append(4)
>>> id(a)
41575088  
>>> a += [2]
>>> id(a)
41575088  
>>> a
[1, 2, 3, 4, 2]

从上面的程序中可以看出,进行两次a = [1, 2, 3]操作,两次a引用的地址值是不同的,也就是说其实创建了两个不同的对象,这一点明显不同于不可变数据类型,所以对于可变数据类型来说,具有同样值的对象是不同的对象,即在内存中保存了多个同样值的对象,地址值不同。

接着我们对列表进行添加操作,分别a.append(4)和a += [2],发现这两个操作使得a引用的对象值变成了上面的最终结果,但是a引用的地址依旧是41575088,也就是说对a进行的操作不会改变a引用的地址值,只是在地址后面又扩充了新的地址,改变了地址里面存放的值。

所以可变数据类型的意思就是说对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,即地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。
 
2、不可变数据类型
不可变数据类型:变量所指向的内存地址处的值是不可以被改变。 
使用不可变数据类型中的 int 为例:

>>> x = 1  
>>> id(x)
31106520  
>>> y = 1  
>>> id(y)
31106520  
>>> x = 2  
>>> id(x)
31106508  
>>> y = 2  
>>> id(y)
31106508  
>>> z = y
>>> id(z)
31106508  
>>> x += 2  
>>> id(x)
31106484

上面这段程序,我们先来看x = 1和y = 1两个操作的结果,从上面的输出可以看到x和y在此时的地址值是一样的,也就是说x和y其实是引用了同一个对象,也就是说内存中对于1只占用了一个地址,而不管有多少个引用指向了它,都只有一个地址值,只是有一个引用计数会记录指向这个地址的引用到底有几个而已。

当我们进行x = 2赋值时,发现x的地址值变了,虽然还是x这个引用,但是其地址值却变化了,后面的y = 2以及z = y,使得x、y和z都引用了同一个对象,即2,所以地址值都是一样的。

当x和y都被赋值2后,1这个对象已经没有引用指向它了,所以1这个对象占用的内存,即31106520地址要被“垃圾回收”,即1这个对象在内存中已经不存在了。最后,x进行了加2的操作,所以创建了新的对象4,x引用了这个新的对象,而不再引用2这个对象。

 

1
一鸣 管理员 answered 10月 ago

Your Answer

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏