Python学习笔记——可变类型和不可变类型

看了几篇同样主题的帖子,学习到许多,但经过亲自试验,发现很多与所听到的说法不符的地方。特此证实并记录。

数据类型分类

Python中的数据包括:Number(包括Int,Float,Bool和Complex),String,Tuple,List,Dict,Set。
这几种数据类型按照是否可变,有如下分类:
不可变类型:Number,String,Tuple
可变类型:List,Dict,Set

不可变类型

如何理解?

这些类型的数据一旦经过初始化创建成功,对应内存地址上的数据本身便不能发生任何变化

具体表现?

  1. 对变量连续赋予相同的值,变量所指向的内存地址不变。【与可变类型的不同之处】
  2. 对变量连续赋予不同的值,变量所指向的内存地址变化。【与可变类型的相同之处】

如果你定义了一个字符串, a = ‘abc’,a这个变量名对应的是内存里的‘abc’这个字符串,其中a是变量(为什么叫变量?因为它随时可以自由变化,只是一个代号,现在让它指向内存里的‘abc’,一会就可以指向别人,毫无忠心可言!),而‘abc’是真正的值,一旦这句代码运行完,‘abc’这个字符串就写死了,别想动它!

>>> a = 'abc'
>>> id(a)
4549707624

如果你想对变量a的值进行改动,比如要增删几个字符,那对应的内存(也就是执行id命令返回的值)也会变化!

>>> a = a + 'def'
>>> a
'abcdef'
>>> id(a)
4550507744
>>> a = a.strip('def')
>>> a
'abc'
>>> id(a)
4550507800
>>> a[1]='B'

有人说,既然不能增,不能减,那如果更改其中的一个字符呢?这就更不可能了,因为不可变类型的数据不支持单项赋值(即所谓的’does not support item assignment’)。

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

另外,这里有一个需要注意的地方:第二段代码片中变量a和经过增删操作的变量a,两者值虽然相等,但id却不同。这意味着:对于不可变类型,哪怕两个变量相等(==),也完全有可能引用自不同的内存地址。 这一点在以后的文章中再继续扩展。

可变类型

如何理解?

这些类型的数据经过初始化创建成功后,对应内存地址上的数据可以发生多次局部变化。

何种表现?

  1. 对变量连续赋予相同的值,变量所指向的内存地址变化。【与不可变类型的不同之处】
  2. 对变量连续赋予不同的值,变量所指向的内存地址变化。【与不可变类型的相同之处】

两者的区别在第一点。相同点在第二点。

区分是否可变之根本原因,私以为在于不可变类型的数据都不支持局部赋值。既然在内存中,变量的名与变量的值是类似映射的关系,不妨用一个更好理解的关系来解释。

将一个班级看作list,其中的每个同学的名字看作string,身份证号看作integer,名字和学号可以看作是不可变的。

三年二班这个班级这个集合是由许多个学生元素组成。学生是根本层面的元素,无法更改,而班级则不同,班级是可以发生局部变化的,比如新学生转入,或者老同学转出,尽管有多次转入和转出,但只要每次的变动不是全班一起转出转入,那三年二班始终是三年二班。

>>> a = 'abc'
>>> n = 123
>>> list = ['abc',123]
>>> id(list)
4311030856
>>> id(a)
4310968168
>>> id(list[0])
4310968168
>>> id(n)
4308696048
>>> id(list[1])
4308696048
>>> list[0] = 'def'
>>> list
['def', 123]
>>> id(list)
4311030856
>>> list.append('hij')
>>> list
['def', 123, 'hij']
>>> id(list)
4311030856
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值