python元组的可变与不可变问题
作者:马马也
这篇文章主要介绍了python元组的可变与不可变问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
python元组的可变与不可变
学过python的人都知道有一种数据类型叫做元组,而元组与列表最重要的区别就在于元组一经定义就不能改变其内容,但元组中的内容真的是完全不可变的吗,看了下面这段代码想必你也会产生这样的疑问.
代码如下:
tuple = (1, 2, 3, [1, 4, 7]) print(tuple) tuple[3][2] = 100 print(tuple)
在编译器上运行上述代码,结果如下:
从结果来看,元组中数据已经产生了变化,那元组还是不可变的吗,我们下面就从内存来解释元组的可变与不可变.
上面的图就是内存图,元组和列表都是引用数据类型,其内存空间存放的元素存放位置的地址值,所谓元组的不可变指的是元组所指向的内存中的内同不可变,在上图中体现的是1,2,3和0x200这四个值不可变,而对于0x200这个地址所指向的列表来说,其内容是可以改变的.
为什么元组Tuple是不可变的,列表List是可变的
1.所谓元组的不可变指的是元组所指向的内存中的内容不可变
# 关于元组是不可变的 tupleA = (1, 2, 3, 4) # tupleA[0] = 0 # 报错 TypeError: 'tuple' object does not support item assignment 不支持修改元素 # 查看内存地址 id() print(id(tupleA)) tupleA = (1, 2, 3, 4) print(id(tupleA)) tupleA = (0, 1, 2, 3) print(id(tupleA))
输出结果是:
1960670738208
1960670738208
1960670737888
从以上实例可以看出,重新赋值的元组 tupleA,绑定到新的对象了,不是修改了原来的对象。
2.List 是可变的
#关于List是可变的 listA = [1, 2, 3] print(id(listA)) listA[0] = 0 print(listA) print(id(listA)) listA = [1, 2, 3] print(id(listA)) listA = [1, 2, 4] print(id(listA))
输出结果是
2974141229248
[0, 2, 3]
2974141229248
2974141227968
2974141229248
从以上实例可以看出,重新赋值的列表listA,并未绑定到新的对象,而是修改了原来的对象。
- 字典中的 key 必须是不可变的类型
- int str tuple 是值类型 (是不可变的)
- List set dict 是引用类型(是可变的)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。