学习笔记-Python开发-017_可变不可变类型

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

img

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


可变类型

指的是:值改变的情况下,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,故没法进行改变
posted @ 2023-02-26 22:35  kinghtxg  阅读(7)  评论(0编辑  收藏  举报