show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次我们了解了元组
- 有了列表为什么还需要有元组呢?
- 因为元组不可变
- 列表可变
- 这就是差异化带来的存在感
- 怎么理解这个不可变(immutable)呢?🤔
- 元组的不可变指的是元组项序列
- 元组项序列不可更改顺序
- 元组项序列不可重新赋值
- 那如果对元组项重新赋值呢?
- 重新赋值
- 不是在原来尾号6736这个位置放入新的元组对象
- 而是新分配一个尾号5456的地址空间
- 在新空间里面构造新元组
- 即使元组一模一样
- 也得新分配空间
- 除了tuple还有什么是immutable的呢?
- tuple可以理解
- 但是数字和字符串为什么也是不可变的呢?
- 将1000赋给数字变量i
- i 引用尾号1728 的内存地址空间
- 尾号1728 的内存地址空间 里面存的是数字1000
- 再将1001赋给变量i
- 不是将 尾号1728 的内存地址空间 存的数字修改为1001
- 而是新分配地址空间 尾号1792
- 在里面存储1001
- 然后将尾号1792的地址空间赋给i
- 如果数字相同呢?
- 只要不是特别小的数字
- 特别小的数字会有小数据池
- 另行考虑
- 特别小的数字会有小数据池
- 都会引用一个新的数字类型的地址空间
- i 是一个变量名
- 引用的是数字常量的地址空间
- 数字常量不能修改
- 但是变量名可以引用不同的数字常量
- 再看看字符串
- 字符串的情况也是一样的
- 每个分配了空间的字符串都是常量
- immutable的
- 同一个字符串变量名可以指向不同的字符串常量
- 再去看看汇编层面的理解
- immutable的变量类型总共有三种
- tuple初始化和list的指令完全不同
- 具体长啥样呢?
- 只装载了一个常量
- 就是元组常量
- 这和list的声明和赋值完全不同
- 列表是先找到三个整数
- 然后用他们建立一个列表
- 我们再总结一下
- 不可变(immutable)的变量类型有三种
- 元组
- 数字
- 字符串
- 很多情况下我们使用元组的原因
- 恰恰就是因为元组不可变
- 将字节序列b"\x00\x01"解包
- 得到的数字序列是不可变的
- 所以这个结果的类型是元组(tuple)
- 而不是可变的列表(list)
- 元组是不是绝对不可变呢?
- 先总结去
- 这次我们深入了解了元组
- 元组不可变指的是
- 为元组对象分配了空间后
- 元组对象就不再改变
- 元组变量指的是
- 引用元组常量的变量名
- 元组不可变指的是
- python中有三种不可变(immutable)的对象类型
- 数字
- 字符串
- 元组
- 元组是不是绝对不可变呢?🤔
- 下次再说 👋