11.python可变不可变类型

it2023-02-10  50

可变不可变类型,就是对之前的数据类型进行补充,就是关于前面学过整型、浮点型、字符串、列表、字典、布尔,对他们进行一个分类

与我们之前提到过堆区和栈区的概念相关


可变类型

指的是:值改变的情况下,id不变,证明改的是原值,也就是说对于栈区而言,所指向的堆区地址是相同的,改变的只是内存地址中存储的值

验证

# 列表类型(可变类型) l = [123,234,456] print(id(l)) # 57045288 l = [1234,2345] print(id(l)) # 57024392 # 如果整体修改列表的内容,列表的ID会发生改变 # 但是!如果只是修改单个值,整个列表ID不会改变,改变的只是列表内部对应的值的内存空间地址,所以列表是可变类型 l[1] = 1234 print(l) # 值已被修改[1234, 1234] print(id(l)) # id没有改变 51781512 # 字典类型 dic = {'k1': 111, 'k2': 222} print(dic) # {'k1': 111, 'k2': 222} print(id(dic)) # 27814200 dic['k1'] = 444 print(dic) # {'k1': 444, 'k2': 222} print(id(dic)) # 27814200 # 可以清楚看到值改变,但是id没有改变,其原理和列表类型相同,字典内部对应的地址改变了,但字典本身值没有改变,所以字典是可变类型 # 字典补充:字典内部定义是逗号分隔为多个{key:value} # 其中value可以是任意类型 # key必须是不可变类型

同样,我们把一个列表赋值给另外一个列表,那么赋值的也是列表的内存地址,所以如果一个列表的内存地址里面存放的值被修改了,另外一个列表的值也会被修改


不可变类型

指的是:值改变的情况下,id也会改变,证明改的不是原值,而是产生新的值,改变的是栈区所对应的堆区地址,也就是说在堆区重新划分了一个取域存放新的值,然后栈区对应的地址指向新的值

验证

# int类型 x = 10 print(id(x)) # 2061563968 x = 11 print(id(x)) # 2061563984 # float类型 x = 10.1 print(id(x)) # 59798736 x = 11.1 print(id(x)) # 59798912 # 字符串类型 x = "abc" print(id(x)) # 22741120 x = "bcd" print(id(x)) # 60099904 # 小结:int、float、str都被设计成了不可分割的整体,不能被改变 # 由于布尔类型只有True和False,故没法进行改变 60099904 # 小结:int、float、str都被设计成了不可分割的整体,不能被改变 # 由于布尔类型只有True和False,故没法进行改变
最新回复(0)