不可变变量
图1
先看 name = “悟空”
变量
变量在图中左侧。
“101”为变量的地址
“name”为变量地址的命名
变量里存的”901“是数据的地址
“蓝色箭头”可以看成是指针的指向内容
数据地址
数据在图的右侧
“901”是数据的内存的地址
“悟空”是数据的内容
第二行 name = “八戒”
因为变量”name“已经创建过了(在第一行里),所以不动。
”八戒“在数据中并没有,所以创建了新数据,数据地址为”902“,内容是”八戒“
”=“吧之前指向”悟空“数据的指针删掉,并重新指向”八戒“的数据,并吧变量”name“里存的悟空”901“的地址改成数据”八戒“的数据地址。改为”902“
第三行 other = name
创建一个变量名为other的变量地址,并指向name的数据地址“902”,内容是“八戒“
第四行 other = ”老朱“
和第二行逻辑一样,只不过是“other”变量指向了新数据“903”,所以变量里存的数据地址改成了“903”。
第五行 print(name)
只打印了变量name的数据。变量other是一个新的变量,2个变量互不影响。所以只看name指向的数据为“八戒“
结论
另外从图可以看出str是一个不可变的变量,每次重新赋值,不会改变原有的数据内容。会重新创建新的数据地址。并指向新的数据地址
list变量(可变变量)
列表增加,插入元素时内存图
列表删除元素时内存图
字典
通过哈希表 定义key地址,查找内容块
小结 - 容器
- 种类与特征
- 字符串:存储字符编码,不可变,序列
- 列表:存储变量,可变,序列
- 元组:存储变量,不可变,序列
- 字典:存储键值对,可变,散列
- 集合:存储键,可变,散列
- 可变与不可变
为什么有可变类型,还需要有不可变类型?(潜台词:为什么有功能强大的,还有用功能弱化的.)
- 可变:预留空间+自动扩容
- 优点:操作方便
- 缺点:占用内存较多
- 不可变:按需分配
- 优点:占用内存较少
- 缺点:操作不方便
- 序列与散列
- 序列
- 优点:有顺序,操作灵活(索引切片)
- 缺点:定位单个元素慢
- 散列
- 优点:定位单个元素快(key),代码可读性更高(key名可自定义)
- 缺点:无顺序,操作不灵活
- 适用性:
- 存储单一维度数据使用列表
- 存储多个维度数据使用字典