Skip to content

Latest commit

 

History

History
249 lines (173 loc) · 5.94 KB

093-748098-列表_乘法_空列表_None.sy.md

File metadata and controls

249 lines (173 loc) · 5.94 KB
show version enable_checker
step
1.0
true

列表 - 运算 - 列表相加

回忆

  • 上次我们了解了列表的加法
  • 加法
    • 加法的本质是将两个列表拼接
    • 并将结果位置赋给帧(frame)上的变量来引用
  • 对于两个列表求和并赋值有4种做法
    • l1 = l1 + l2
    • l1 += l2
    • l1[-1:] = l2
    • l1.extend(l2)
  • 上述四种方法结果相同
    • 但是稍有区别
      • 第一种l1 = l1 + l2
        • 会改变l1 所引用的地址
        • 后三种不改变地址
      • 第四种l1.extend(l2)
        • 效率最高
        • 在当前列表位置后继续扩展列表

图片描述

  • 既然列表有加法
  • 那列表可以有乘法吗?🤔
  • 那列表可以有乘法吗?🤔

回忆字符串

  • 字符串乘法

图片描述

  • 乘法的本质是累加
  • 列表也能做乘法吗?

列表乘法

图片描述

  • 最大能有多少个元素呢?

试探边缘

图片描述

  • 5个9好像也没有问题
  • 没有问题就继续试探

边缘

图片描述

  • 8个9之后自动退出python了
    • 这实在是有问题啊
    • 问题在哪儿呢?
  • 怎么也没有报个Error啥的?

图片描述

  • range函数对应的列表也会发生同样的问题
    • 但如果比八个九还多会如何呢?

越过边缘

图片描述

  • 9个9的时候就报一个内存错误
  • 如果参数超过八字节的整数又会如何呢?

新的边缘

  • 超过了八字节属于大数,不是一般的结构
    • 加减乘除还有定义
    • 但是想让他成为range的参数就不行了
    • 因为没有相应的处理函数

图片描述

  • 在8字节里面也不是都能处理
    • 说明python的解释器毕竟还是受到内存的物理限制的

图片描述

  • 东西太多了容易乱
  • 我把列表清空吧

清空列表

图片描述

  • 清空列表非常简单
  • 但是这个和clear有什么区别呢?

clear 与 = []

图片描述

  • clear是将这个列表对象里面所有列表项清空
    • 列表对象所引用的内存地址不变

图片描述

  • 将空列表赋给列表变量
    • 原列表所引用的内存地址无人再引用
      • 等待垃圾回收
    • 新申请了一个内存空间放置空列表
    • 让原来的变量名引用新分配的空列表

两个空列表相等吗?

图片描述

  • 两个空列表所引用的地址并不相等
    • 虽然都是空列表
    • 但是各有各的地址
    • 空列表本质还是一个列表
    • 并不是真的空
  • 我想让他真的空
  • 怎么办呢?

None

  • None 的意思是
    • 啥也不是
    • 不是数字
    • 不是字符串
    • 不是列表
    • 啥也不是

图片描述

  • None的类型是
    • NoneType
    • 啥类型不是
  • 帮助说啥呢?

NoneType

  • 啥也没说

图片描述

  • 这样l1、l2就啥也不是了

图片描述

  • 因为他俩都啥也不是

图片描述

  • 所以相等了

None的地址

  • 所有None的地址相同
    • 都是id(None)
      • 可以打印观察
      • print(id(None))

图片描述

  • None

    • 啥也不是
  • []

    • 啥也没有的列表
    • 空列表
  • 空列表也可以有乘法吗

空列表

  • 如果本身就是空列表
    • 列表里面没有列表项
    • 乘多少还是空的

图片描述

  • 但如果列表面有东西
    • 乘出来列表项就翻倍了
    • 即使里面是空列表
    • 空列表对象也翻倍
  • 这怎么理解?

空列表作为列表项

  • []是空列表
    • 长度为0

图片描述

  • [[]]是有1个元素的列表
    • 长度为1

图片描述

  • [[]]的第0个元素为[]

图片描述

  • [[]] * 3
    • 就将这唯一的列表项[]
    • 复制3次
    • 还放在列表里
    • 就是[[], [], []]
  • 有点绕
  • 乘法的结果可以增强赋值吗?

乘法增强赋值

  • 直接赋值修改原来引用的地址

图片描述

  • 增强赋值不修改原来引用的地址

图片描述

  • 规则和加法赋值类似

总结

  • 这次我们了解了列表的乘法运算
  • 我们总结一下各种运算
  • 赋值运算
    • 直接用列表给对象赋值
      • 使用列表地址
      • 两个列表指向同一位置
    • 制作副本的3种方法
      • copy拷贝
      • list构造函数
      • slice切片
  • 加法
    • l1 = l1 + l2
    • l1 += l2
    • l1[-1:] = l2
    • l1.extend(l2)
  • 乘法
    • 乘法的本质是累加
    • 规则和加法类似
    • 但是数据特别大时候会抛出异常
  • 列表还有什么好玩的吗?🤔
  • 下次再说 👋