oeasy教python108 列表_加法_增强赋值_加等于_extend_扩展列表

回忆

  • 列表 赋值运算 两种形式
    1. 将列表 直接 赋值
      • 造成两个列表指向同一个对象
      • 一改全改

 

    1. 将 列表副本 赋给 变量
      • 这两个列表变量指向不同的对象
      • 互不影响

 

 

clist1 = list("oeasy") clist2 = clist1 clist2 = clist1.copy()

 

  • 列表 能相加 吗?🤔

lst1 + lst2
回忆字符串

  • 字符串可以进行
    • 加法
    • 乘法

 

"动词打次" + "东东打次" "动词打次" * 3 + "东东打次" ("动词打次" * 3 + "东东打次") * 4

  • 字符串加法
    • 有啥应用 吗?

 

四大名著大乱炖


import random # 从四大名著中分别提取角色和事迹 # 《西游记》 journey_to_the_west_characters = ["孙悟空", "唐僧", "沙僧"] journey_to_the_west_stories = ["大闹天宫", "三打白骨精", "真假美猴王"] # 《红楼梦》 dream_of_the_red_chamber_characters = ["林黛玉", "贾宝玉", "薛宝钗"] dream_of_the_red_chamber_stories = ["黛玉葬花", "宝玉挨打", "宝钗扑蝶"] # 《三国演义》 romance_of_the_three_kingdoms_characters = ["刘备", "关羽", "诸葛亮"] romance_of_the_three_kingdoms_stories = ["桃园结义", "草船借箭", "空城计"] # 《水浒传》 water_margin_characters = ["宋江", "武松", "鲁智深"] water_margin_stories = ["怒杀阎婆惜", "景阳冈打虎", "倒拔垂杨柳"] # 汇总角色列表 all_characters = journey_to_the_west_characters + \ dream_of_the_red_chamber_characters + \ romance_of_the_three_kingdoms_characters + \ water_margin_characters # 汇总事迹列表 all_stories = journey_to_the_west_stories + \ dream_of_the_red_chamber_stories + \ romance_of_the_three_kingdoms_stories + \ water_margin_stories # 随机搭配角色和事迹 random_character = random.choice(all_characters) random_story = random.choice(all_stories) print(f"{random_character}——{random_story}")
结果

 

  • 代码中的反斜杠 是
    • 续航符
    • line-continuation character

 

# 汇总角色列表 all_characters = journey_to_the_west_characters + \ dream_of_the_red_chamber_characters + \ romance_of_the_three_kingdoms_characters + \ water_margin_characters

  • 可以避免 横向滚动

列表加法

 

lst1 = list(range(3)) print("lst1:", lst1) lst2 = [3, 4, 5] print("lst2:", lst2) print("lst1 + lst2:", lst1 + lst2)

  • 数字列表
    • 可以相加

 

 

  • 字符串列表
    • 可以 相加 吗?

 

加法运算

  • 字符串列表
    • 也是可以相加的

 

lst1 = list("oeasy") lst2 = list("o2z") print(lst1 + lst2)

  • 但是 相加的结果
    • 没赋给 任何变量
    • 直接 就

 

 

  • 想 不让他
    • 咋办呢?

 

加完了赋值

  • 把加完的结果赋给 lst3

lst1 = list("oeasy") lst2 = list("o2z") lst3 = lst1 + lst2

  • 相加结果 有 变量名引用
    • 就不会 被 垃圾回收

 

 

  • 什么是垃圾回收呢?

垃圾回收

  • c语言
    • 手动 分配和释放内存

 

  • 内存空间
    • 分配容易
      • 但 容易 忘记释放

 

    • 结果
      • 占用内存 越来愈多
      • 造成泄漏、崩溃

 

 

 

  • python 等现代语言 解释器
    • 定期观察 已经分配的 内存空间
      • 是否 还有变量 在引用
      • getrefcount

 

    • 没有引用的话
      • 就垃圾回收
      • garage collection

 

 

lst3 = lst1 + lst2

  • 把求和结果 赋给lst3
    • 就能存的住了

 

  • 如果 把 求和结果
    • 直接 赋给 lst1 呢?

 

将列表之和赋回给lst1
lst1 = list("oeasy") lst2 = list("o2z") lst1 = lst1 + lst2

  • 赋值成功

 

  • 能用 增强赋值 吗?

增强赋值
增强赋值
是一种 赋值
在赋值之外 还有增强

  • += 就是 增强赋值运算
    • augmented assignment

 

lst1 = list("oeasy") lst2 = list("o2z") lst1 += lst2

  • lst1 += lst2
    • 相当于 lst1 = lst1 + lst2

 

 

  • 这俩完全一样吗?

增强赋值运算

  • 从求和结果来看
    • 两者一致

 

lst1 = list("oeasy") print("lst1:", id(lst1)) lst2 = list("o2z") print("lst2:", id(lst2)) lst1 += lst2 print("lst1:", id(lst1))

  • 增强赋值中 lst1 的 地址没有变

 

  • 先求和 再赋值呢?

观察
lst1 = list("oeasy") print("lst1:", id(lst1)) lst2 = list("o2z") print("lst2:", id(lst2)) lst1 = lst1 + lst2 print("lst1:", id(lst1))

  • 从引用地址 来看
    • l1 使用 l1 + l2 的新地址
    • += 则会保留 l1 原来引用的地址

 

 

  • 有啥区别吗?

效率
效果 相同 - 但效率不同!

  • 加法运算 效率低
    • 过程是 新建一个列表
    • 然后把 lst1 的列表项都拿过来
    • 再把 lst2 的列表项都拿过来
    • 最后把相加结果 赋给lst1

 

  • 效率 不如
    • 增强赋值

 

 

  • 增强赋值 就是
    • 用列表 扩充(extend)列表

 

extend

  • 列表还真有个成员方法
    • 就叫做 extend

 

lst1 = list("oeasy") lst2 = list("o2z") lst1.extend(lst2)

  • 确实能够扩列
    • 扩展列表

 

 

  • 这个extend怎么用?

查询帮助
help(list.extend)

  • extend
    • 把参数里面的列表
    • 循环地放到extend方法的主体后面

 

 

  • 将列表相加
    • lst1 = lst1 + lst2
    • 可以得到列表在 新地址

 

  • 有 2种方式 可以 扩充列表
    1. lst1 += lst2
    2. lst1.extend(l2)

 

  • extend(扩列) 和 append(追加)
    • 有什么区别呢?

 

区别
num_list = [1, 2, 3] print(num_list) num_list.append([4, 5]) print(num_list) num_list.remove([4, 5]) print(num_list) num_list.extend([4, 5]) print(num_list)

  • 效果不同


对比

  • append
    • 添加是 列表项
    • 把列表作为元素 放到最后

 

  • extend
    • 扩展 原始列表
    • 把 新列表 对接到 原列表 尾巴上
    • 对应 加法赋值

 

 

对比项appendextend
描述 添加的是列表项 扩展原始列表
特点 将元素作为整体添加到列表末尾 把新列表对接到原列表尾巴上,合并两个列表

总结

  • 这次我们了解 列表加法
    1. 对 相加结果 赋值
      - lst1 = lst1 + lst2 - 加法的本质 是 将两个列表 拼接 - 并将 结果位置 赋给帧(frame)上的变量 来引用
    2. 对列表 进行扩充 - 3种做法
      1. lst1 += lst2
      2. lst1[-1:] = lst2
      3. lst1.extend(lst2)

 

 

  • 上述 2类方法 结果相同
    • 但是稍有区别
      1. 结果地址
        • 会改变l1地址
        • 后三种不改变地址

 

      1. 效率不同
        • 后三种效率高
        • 直接扩展列表

 

 

 

 

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

 

  • 下次再说 👋



posted on 2025-11-30 09:17  overmind1980  阅读(0)  评论(0)    收藏  举报