Skip to content

Latest commit

 

History

History
136 lines (95 loc) · 3.38 KB

102-192304-元组_tuple_不可变_immutable.sy.md

File metadata and controls

136 lines (95 loc) · 3.38 KB
show version enable_checker
step
1.0
true

列表 - 嵌套 embedded

回忆

  • 上次我们了解了元组
    • 有了列表为什么还需要有元组呢?
    • 因为元组不可变
    • 列表可变
    • 这就是差异化带来的存在感

图片描述

  • 怎么理解这个不可变(immutable)呢?🤔

不可变

图片描述

  • 元组的不可变指的是元组项序列
    • 元组项序列不可更改顺序
    • 元组项序列不可重新赋值
  • 那如果对元组项重新赋值呢?

重新赋值

图片描述

  • 重新赋值
    • 不是在原来尾号6736这个位置放入新的元组对象
    • 而是新分配一个尾号5456的地址空间
    • 在新空间里面构造新元组

图片描述

  • 即使元组一模一样
  • 也得新分配空间
  • 除了tuple还有什么是immutable的呢?

查看文档

图片描述

  • tuple可以理解
  • 但是数字和字符串为什么也是不可变的呢?

数字

图片描述

  • 将1000赋给数字变量i
    • i 引用尾号1728 的内存地址空间
    • 尾号1728 的内存地址空间 里面存的是数字1000
  • 再将1001赋给变量i
    • 不是将 尾号1728 的内存地址空间 存的数字修改为1001
    • 而是新分配地址空间 尾号1792
    • 在里面存储1001
    • 然后将尾号1792的地址空间赋给i
  • 如果数字相同呢?

即使是相同数字

图片描述

  • 只要不是特别小的数字
    • 特别小的数字会有小数据池
      • 另行考虑
  • 都会引用一个新的数字类型的地址空间
  • i 是一个变量名
    • 引用的是数字常量的地址空间
    • 数字常量不能修改
    • 但是变量名可以引用不同的数字常量
  • 再看看字符串

字符串

  • 字符串的情况也是一样的

图片描述

  • 每个分配了空间的字符串都是常量
    • immutable的
    • 同一个字符串变量名可以指向不同的字符串常量

字节解包

  • 将字节序列b"\x00\x01"解包
    • 得到的数字序列是不可变的

图片描述

  • 所以这个结果的类型是元组(tuple)
    • 而不是可变的列表(list)

时间解包

import time
localtime = time.localtime()
print(localtime)
print(type(localtime))
for num in range(9):
    print(localtime[num])
  • 得到本地时间元组

  • 元组是不是绝对不可变呢?

  • 先总结去

总结

  • 这次我们深入了解了元组
    • 元组不可变指的是
      • 为元组对象分配了空间后
      • 元组对象就不再改变
    • 元组变量指的是
      • 引用元组常量的变量名
  • python中有三种不可变(immutable)的对象类型
    • 数字
    • 字符串
    • 元组

图片描述

  • 元组是不是绝对不可变呢?🤔
  • 下次再说 👋