python的可变数据类型和不可变数据类型

将python3的基本数据类型有六种: Number(int,  float, bool, complex),String, List, Tuple, Dictionary, Set

其中,

可变数据类型:list,dic,set

不可变数据类型:Number, String,  Tuple

两者区别:

>>> a = [1, 2]
>>> print(id(a))
140275482722248
>>> a[0] = 2
>>> print(id(a)
... )
140275482722248
>>>

以list为例子说明可变数据类型对象是可以改变其对象内容的,id()函数用于获取对象的内存地址,如上所示,更改了列表a中第一个元素,列表对象a的内存地址信息不变,说明列表对象的内容是可以修改的.对于dic和set的测试也是一样的

>>> a = (1, 2, 4)
>>> a[0] = 100
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

>>> int1 = 1
>>> print(id(int1))
9164864
>>> int1 += 1
>>> print(id(int1))
9164896
>>> int2 = 1
>>>
>>> print(id(int2))
9164864
>>>

简单说不可变数据的特点是当你创建了一个不可变数据类型对象,对象所在地址的数据内容是不允许修改的,比如说上述的(1, 2, 4),这个元组对象的内容的是不允许修改的,假设我们强行想修改元组内的数据,如 a[0] = 100 ,会出现提示报错。接下来不可变数据数字int类型 int1 += 1其实本质并不是在修改原本 值为1的对象的值,它是重新新建了值为2的对象然后用 int1 指向了这个新对象,所以int1前后内存地址不一样.再来又将对象1给了int2, 此时内存中已经有了值为1的对象,所以 int2 直接指向了内存中的 1 对象,并非新建一个新对象.从前后id值可以判断出来.这表明对于不可变数字类型 int(string同情况) 来说内容相同的对象都指向了同一内存(就是说实际上就只有一个对象,而有多个不同的引用),这一点区别与可变数据类型(以及其他不可变数据类型对象),两个相同内容的可变数据类型对象(不可变数据类型对象)是占用两块不同内存空间的.如下代码

>>> list1 = [1, 2,3]
>>> print(id(list1))
139938661048072
>>> list2 = [1, 2, 3]
>>> print(id(list2))
139938661047880
>>>

对于不可变数据int和短字符串类型,无论申明多少个值相同的对象,在内存中都指向同一个内存地址,这一特征主要因为python内存管理机制带来的,python会缓存这两种类型的数据以便重复使用

对于不可变数据类型,如果想要修改对象内容,其本质是新建了一个内容不同的对象。

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值