Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0108
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在:
- 个人网站: `https://oeasy.org`
- 蓝桥云课: `https://www.lanqiao.cn/courses/3584`
- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
- Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 配套视频
- 列表 赋值运算 两种形式
- 将列表 直接 赋值
- 造成两个列表指向同一个对象
- 一改全改
- 将 列表副本 赋给 变量
- 这两个列表变量指向不同的对象
- 互不影响
- 将列表 直接 赋值
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 = 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
lst1 = list("oeasy")
lst2 = list("o2z")
lst1.extend(lst2)
- 确实能够扩列
- 扩展列表
- 这个extend怎么用?
help(list.extend)
- extend
- 把参数里面的列表
- 循环地放到extend方法的主体后面
-
将列表相加
- lst1 = lst1 + lst2
- 可以得到列表在 新地址
-
有 2种方式 可以 扩充列表
- lst1 += lst2
- 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
- 扩展 原始列表
- 把 新列表 对接到 原列表 尾巴上
- 对应 加法赋值
| 对比项 | append | extend |
|---|---|---|
| 描述 | 添加的是列表项 | 扩展原始列表 |
| 特点 | 将元素作为整体添加到列表末尾 | 把新列表对接到原列表尾巴上,合并两个列表 |
- 这次我们了解 列表加法
- 3种做法
- lst1 += lst2
- lst1[-1:] = lst2
- lst1.extend(lst2)
- 3种做法
- 上述 3类方法 结果相同 但是稍有区别
- 结果地址
- 第一种方法会改变l1地址
- 后两种不改变地址 2.效率不同
- 第一种效率低
- 新建列表再赋值
- 后两种效率高
- 直接扩展列表
- 结果地址
- 既然 有 列表
加法- 那有 列表
乘法吗?🤔
- 那有 列表
- 下次再说 👋
- 配套视频
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。
















