python3数据类型–可变与不可变

avatar 2020年3月5日18:35:50 评论 1,368 次浏览

数据类型分为可变数据类型和不可变数据类型,可变数据类型是指当数据类型对应的变量发生了改变,并且对应的内存地址不会改变。不可变数据类型是指数据类型发生了改变,相应的变量对应的内存地址也发送了改变。这里提示一下查看变量的内存地址使用内置函数id()。下面针对前面所学的几种数据类型进行一下举例:

列表(list)

先声明一个变量,赋值一个列表,修改原列表的元素后,列表的内存地址不变。修改前后的列表变量名指向同一个内存地址。看下面的例子:

#!/usr/bin/python3
#coding:utf-8
#吴老二个人博客~~~www.wulaoer.or
wulaoer = ['golong','DevOps']
print(wulaoer,id(wulaoer),type(wulaoer))
wulaoer[1]='ruby'
print(wulaoer,id(wulaoer),type(wulaoer))

输出结果:

['golong', 'DevOps'] 2633278695176 <class 'list'>
['golong', 'ruby'] 2633278695176 <class 'list'>

列表修改后内存地址没有发生改变,所以是可变类型。

字典(dict)

申明的字典变量,修改字典中的一个元素的value,修改后的字典和新字典的内存地址不变,看下面的例子:

#!/usr/bin/python3
#coding:utf-8
#吴老二个人博客~~~www.wulaoer.or
wulaoer = {'golong':'DevOps','java':'ruby'}
print(wulaoer,id(wulaoer),type(wulaoer))
wulaoer['java']='jenkins'
print(wulaoer,id(wulaoer),type(wulaoer))

输出结果:

{'golong': 'DevOps', 'java': 'ruby'} 2357833006680 <class 'dict'>
{'golong': 'DevOps', 'java': 'jenkins'} 2357833006680 <class 'dict'>

字典修改元素之后内存地址没有发生改变,所以是可变类型。

整数(int)

申明的整数变量,重新赋值即是修改,重新赋值后内存地址发送了改变,看下面的例子:

#!/usr/bin/python3
#coding:utf-8
#吴老二个人博客~~~www.wulaoer.or
wulaoer = 27
print(id(wulaoer),type(wulaoer))
wulaoer = 2
print(id(wulaoer),type(wulaoer))

输出结果:

1793617744 <class 'int'>
1793616944 <class 'int'>

内存地址发生了改变,整数为不可变类型.

字符串(str)

字符串和整数一样修改字符串的值相当于重新赋值,赋值后的内存地址发生变化。

#!/usr/bin/python3
#coding:utf-8
#吴老二个人博客~~~www.wulaoer.or
wulaoer = 'python3'
print(id(wulaoer),type(wulaoer))
wulaoer = 'python'
print(id(wulaoer),type(wulaoer))

输出结果:

2856968604560 <class 'str'>
2856971152104 <class 'str'>

内存地址发生了改变,字符串为不可变类型

元组(tuple)

元组是不能修改的,所以在元组中嵌套了一个列表,修改列表后内存地址没有发送改变,所以元组是不可变类型

#!/usr/bin/python3
#coding:utf-8
#吴老二个人博客~~~www.wulaoer.or
wolf = ['golong','DevOps']
wulaoer = ('python3','ruby',wolf)
print(wulaoer,id(wulaoer),type(wulaoer))
wolf[1]='java'
print(wulaoer,id(wulaoer),type(wulaoer))

输出结果:

('python3', 'ruby', 'python3', 'DevOps')
('python3', 'ruby', ['golong', 'DevOps']) 2335573760400 <class 'tuple'>
('python3', 'ruby', ['golong', 'java']) 2335573760400 <class 'tuple'>

元组修改了,但是内存地址没有改变,这是因为元组中的列表元素修改前后,嵌套的列表内存地址都不会改变,所以元组的内存地址也不会改变。所以元组是不可更改的,所以元组也是不可变类型。

集合(set)

在集合中添加了一个元素,对比添加前后的集合,数据发生了改变,内存地址没有变化。

#!/usr/bin/python3
#coding:utf-8
#吴老二个人博客~~~www.wulaoer.or
wulaoer = {'golong','DevOps'}
print(wulaoer,id(wulaoer),type(wulaoer))
wulaoer.add('ruby')
print(wulaoer,id(wulaoer),type(wulaoer))

输出结果:

{'golong', 'DevOps'} 2149145806664 <class 'set'>
{'ruby', 'golong', 'DevOps'} 2149145806664 <class 'set'>

集合修改元素之后,内存地址没有发生改变,所以是可变类型

总结:

可变类型包括list(列表),dict(字典),set(集合)。
不可变类型包括Number(数字),str(字符串),tuple(元组)。那么什么是可变类型什么是不可变类型呢?你明白了吗?

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: