一、Python可变类型和不可变类型

1.可变类型和不可变类型

1.1基本概念:

不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。
可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
总结:不可变数据类型更改后地址发生改变,可变数据类型更改地址不发生改变;可变数据类型没有开辟新的内存空间,而不可变数据类型需要开辟新的内存空间;

1.2、通过Python数据结构查看对应数据类型

# int
int_a = 1
print("整数a的地址{:};整数a的类型{:}".format(id(int_a), type(int_a)))
int_a = 2
print("整数a的地址{:};整数a的类型{:}".format(id(int_a), type(int_a)))
# 运行结果:
# 整数a的地址4542888688;整数a的类型
# 整数a的地址4542888720;整数a的类型

# 字符串
str_a = 1
print("字符串a的地址{:};字符串a的类型{:}".format(id(str_a), type(str_a)))
str_a = 2
print("字符串a的地址{:};字符串a的类型{:}".format(id(str_a), type(str_a)))
# 运行结果:
# 字符串a的地址4451588848;字符串a的类型
# 字符串a的地址4451588880;字符串a的类型

# tuple
list_c = [1,2,4]
# 元组中加入列表,验证元组是否地址会发生改变
tuple_c = (1,3,list_c)
print("未修改前元组的值{:},未修改前元组的地址{:},数据类型:{:}".format(tuple_c, id(tuple_c), type(tuple_c)))
#修改列表的值
list_c[1]='hello'
print("修改后元组的值{:}, 修改后元组的地址{:},数据类型:{:}".format(tuple_c,id(tuple_c), type(tuple_c)))
# 运行结果:
# 未修改前元组的值(1, 3, [1, 2, 4]),未修改前元组的地址4490637824,数据类型:
# 修改后元组的值(1, 3, [1, 'hello', 4]), 修改后元组的地址4490637824,数据类型:
# 元组定义值是不可更改的,嵌套的列表值虽然发生改变但是地址并未发生变化,表明修改只是在嵌套列表内部产生的效果,并未影响到元组本身,故元组前后值等于没有发生变化,
# 因此说明元组是不可变类型

# 列表
list_b = [1,2,3,4]
print("未修改前列表的值{:},未修改前列表的地址{:},数据类型{:}".format(list_b,id(list_b), type(list_b)))
list_b[1] = 'test'
print("修改后列表的值{:},修改后列表的地址{:},数据类型{:}".format(list_b,id(list_b), type(list_b)))
# 运行结果:
# 未修改前列表的值[1, 2, 3, 4],未修改前列表的地址4495392640,数据类型
# 修改后列表的值[1, 'test', 3, 4],修改后列表的地址4495392640,数据类型

# 集合
set_a = {1, 'a', 'bn', 3, 5}
print("未修改前集合的值{:},未修改前集合的地址{:},数据类型{:}".format(set_a,id(set_a), type(set_a)))
set_a.add('test')
print("修改后集合的值{:},修改后集合的地址{:},数据类型{:}".format(set_a,id(set_a), type(set_a)))
# 运行结果:
# 未修改前集合的值{1, 3, 5, 'a', 'bn'},未修改前集合的地址4513094784,数据类型
# 修改后集合的值{1, 3, 'test', 5, 'a', 'bn'},修改后集合的地址4513094784,数据类型


# 字典
dict_a = {"test1":1, "test2":2,"test3":3}
print("未修改前字典的值{:},未修改前字典的地址{:},数据类型{:}".format(dict_a,id(dict_a), type(dict_a)))

dict_a['test4'] = 'hello'
print("修改后字典的值{:},修改后字典的地址{:},数据类型{:}".format(dict_a,id(dict_a), type(dict_a)))
# 运行结果:
# 未修改前字典的值{'test1': 1, 'test2': 2, 'test3': 3},未修改前字典的地址4402480192,数据类型
# 修改后字典的值{'test1': 1, 'test2': 2, 'test3': 3, 'test4': 'hello'},修改后字典的地址4402480192,数据类型

1.3、总结

​ 通过以上结果验证:

​ 属于可变类型:字典、列表、集合;

​ 属于不可变类型:字符串、整数、元组

你可能感兴趣的:(Python,python)