鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[快问快答] 第022讲:列表(IV)

[复制链接]
发表于 2026-3-23 15:44:41 | 显示全部楼层
零基础入门学习Python封面
《零基础入门学习Python》
(最新版)
小甲鱼 著
立即购买
@FishC 创建一个包含 5 个空列表的列表,哪种方法最安全?
A. [[]] * 5
B. [[] for i in range(5)]
C. list([[]] * 5)
D. [].extend([[] * 5])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-23 15:45:05 | 显示全部楼层
13750868166 发表于 2026-03-23 15:44
@FishC 创建一个包含 5 个空列表的列表,哪种方法最安 ...


正确答案是 B. [[] for i in range(5)]


详细解释:

A 和 C 的问题是它们创建的是对 同一个空列表的引用,修改其中任何一个子列表,其他所有子列表都会跟着改变,这通常不是想要的效果。

选项 D 语法错误,.extend() 方法返回 None,不会生成新列表,因此无法创建出包含5个空列表的列表。

只有选项 B 使用列表推导式,在循环中 每次都会创建一个新的空列表,这5个子列表是完全独立的对象,互不影响,所以最安全、最符合预期。




  1. # 错误示例:A 和 C 的方法
  2. list_a = [[]] * 5
  3. print("初始A:", list_a)  # [[], [], [], [], []]
  4. list_a[0].append(1)
  5. print("修改后A:", list_a)  # [[1], [1], [1], [1], [1]] 所有子列表都被改变

  6. # 正确示例:B 的方法
  7. list_b = [[] for i in range(5)]
  8. print("初始B:", list_b)  # [[], [], [], [], []]
  9. list_b[0].append(1)
  10. print("修改后B:", list_b)  # [[1], [], [], [], []] 只有第一个子列表被改变

  11. # 错误示例:D 的方法
  12. list_d = [].extend([[] * 5])
  13. print("D的结果:", list_d)  # 输出 None,不是我们想要的列表
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-23 15:51:24 | 显示全部楼层
@FishC 执行以下代码后,结果是 True 还是 False?

a = ['Python'] * 2
b = ['Python', 'Python']
result = a == b and a is not b

A. True
B. False
C. 报错
D. None
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-23 15:52:09 | 显示全部楼层
13750868166 发表于 2026-03-23 15:51
@FishC 执行以下代码后,结果是 True 还是 False?

...

  1. a = ['Python'] * 2
  2. b = ['Python', 'Python']
  3. result = a == b and a is not b
复制代码


执行以上代码,a == b 比较列表的值,由于两个列表都包含两个字符串 'Python',所以值为 True。a is not b 检查是否不是同一个对象,由于 a 和 b 是通过不同方式创建的两个不同列表对象,所以也为 True。因此 result 为 True。

答案:A. True

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-23 20:23:36 | 显示全部楼层
@FishC 下面哪个表达式的结果是 [[1], [1], [1]]?
A. [[1]] * 3
B. [[1] for _ in range(3)]
C. [1] * 3
D. [[1, 1, 1]]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-3-23 20:24:56 | 显示全部楼层
学python的Peter 发表于 2026-03-23 20:23
@FishC 下面哪个表达式的结果是 [, , ]?
A. [] * 3
...


答案:B

分析如下:

  • 选项 A:[[1]] * 3
      该表达式会创建一个包含三个相同引用的列表,即三个内部列表指向同一个 [1] 对象。虽然输出结果在值上为 [[1], [1], [1]],但修改其中一个内部列表会影响所有。
  • 选项 B:[[1] for _ in range(3)]
      使用列表推导式,每次迭代都会创建一个新的 [1] 列表,因此三个内部列表是独立的,输出结果为 [[1], [1], [1]]
  • 选项 C:[1] * 3
      该表达式生成一个平铺列表 [1, 1, 1],不符合目标结构。
  • 选项 D:[[1, 1, 1]]
      该表达式生成一个包含单个列表(其中有三个元素)的列表 [[1, 1, 1]],不符合目标结构。


因此,选项 B 是符合要求且更安全的选择。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
@FishC 访问二维列表 matrix = [[1,2],[3,4],[5,6]] 的最后一个元素 6,正确的方式是?
A. matrix[3][2]
B. matrix[2][1]
C. matrix[-1][-1]
D. matrix[6]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
wxblsh 发表于 2026-03-27 09:19
@FishC 访问二维列表 matrix = [,,] 的最后一个元素 6 ...


正确的选项是 BC

解释:
- 二维列表 matrix 的结构为:三个子列表,每个子列表包含两个元素。
  - 第一个子列表:[1, 2],索引 0
  - 第二个子列表:[3, 4],索引 1
  - 第三个子列表:[5, 6],索引 2
- 要访问最后一个元素 6,需要先定位到第三个子列表(索引 2),再访问该子列表的第二个元素(索引 1)或使用负索引从末尾访问。

选项分析:
- A: matrix[3][2] — 错误,因为 matrix 只有三个子列表(索引 0-2),且子列表只有两个元素(索引 0-1),索引超出范围。
- B: matrix[2][1] — 正确,访问第三个子列表的第二个元素,即 6。
- C: matrix[-1][-1] — 正确,使用负索引:matrix[-1] 获取最后一个子列表 [5, 6][-1] 获取该子列表的最后一个元素 6。
- D: matrix[6] — 错误,matrix 只有三个元素,索引 6 超出范围。

代码验证:


  1. matrix = [[1,2],[3,4],[5,6]]
  2. print(matrix[2][1])   # 输出 6
  3. print(matrix[-1][-1]) # 输出 6
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-1 13:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表