一、定义
可变类型
:值改变,id不变,证明了改变的是原值,证明原值是可以被改变
不可变类型
:值改变,id改变,证明是产生的新值,并没有改变原值,证明原值是不能被改变
二、验证
1、int
x = 10
print(id(x))
x = 100
print(id(x))
id不一致故为不可变类型!
2、str
str = 'abc'
print(id(str))
str = 'defx'
print(id(str))
id不一致故为不可变类型!
float、布尔类型都是不可变类型,可以自己去试此处就不再多说
3、list
a = [1,2,3,4,5]
print(id(a))
a.insert(0,100)
print(id(a))
列表就是可变类型。
看内存图解:
你看我们只会改变列表中存的东西,a的直接引用的地址0xfff00001并没变。还有就是列表中存的元素内存地址不是连续的。
三、总结
- int、float、str、布尔这些类型的数据都被设计成了不可分割的整体,不能够被改变。
- 容器类型(例如列表、字典等)大部分都是可变类型,但也有例外,比如元组和str,str其实我认为也可以看作一个容器,因为它也有索引,元组和str都没有可以在原元组和原字符串上进行操作的方法(比如插入、追加等操作),所以它是不可变类型。
- 无论什么类型,容器也好、int、str等数据类型也好,它们只要重新赋值,其id都一定会变。
当然本条总结和可变和不可变的判断没有关系
,可变都是能对其本身进行操作。无法对其本身操作就是不可变。
无法对其本身操作就是不可变,怎么理解:
a = 10
b = 3.2
c = True
str = 'abc'
tuple = (1,)
#我们无法找到任何一个对上述数据类型的本身进行操作的方法,比如我们没有insert函数在整型前面插入一个1。
重新赋值什么意思?为什么能改变列表地址?:
l = [1,2,3,4,5]
l = ['aa',3,[2,3]]
这一看就是内存地址是改变了的。
四、字典了解补充
我们都知道字典是由key和value组成,那么key和value到底有什么样的一个限制呢?
key必须是不可变类型,value可以是任意类型
例如:
#你可以创建一个这样的字典:
a = {1:200,3.1:'a',True:[1,2,3],'a':2}
#但你不能创建一个这样的字典:
a = {[1,2]:1,(1,3):'abc'}
扫描二维码关注公众号,回复:
11227702 查看本文章