回忆
-
列表 赋值运算 两种形式
-
将列表 直接 赋值
-
造成两个列表指向同一个对象
-
一改全改
-
-
将 列表副本 赋给 变量
-
这两个列表变量指向不同的对象
-
互不影响
-
-
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种方式 可以 扩充列表
-
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 |
|---|---|---|
| 描述 | 添加的是列表项 | 扩展原始列表 |
| 特点 | 将元素作为整体添加到列表末尾 | 把新列表对接到原列表尾巴上,合并两个列表 |
总结
-
这次我们了解 列表加法
-
对 相加结果 赋值
- lst1 = lst1 + lst2 - 加法的本质 是 将两个列表 拼接 - 并将 结果位置 赋给帧(frame)上的变量 来引用 -
对列表 进行扩充 - 3种做法
-
lst1 += lst2
-
lst1[-1:] = lst2
-
lst1.extend(lst2)
-
-
-
上述 2类方法 结果相同
-
但是稍有区别
-
结果
地址-
会改变l1地址
-
后三种不改变地址
-
-
效率不同-
后三种效率高
-
直接扩展列表
-
-
-

-
既然 有 列表
加法-
那有 列表
乘法吗?🤔
-
-
下次再说 👋
890

被折叠的 条评论
为什么被折叠?



