鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 小甲鱼

[快问快答] 第023讲:列表(V)

[复制链接]
发表于 2026-3-20 07:12:28 | 显示全部楼层
零基础入门学习Python封面
《零基础入门学习Python》
(最新版)
小甲鱼 著
立即购买
haly 发表于 2026-03-20 07:11
@FishC 以下代码中,哪一行会改变两个变量指向的内容 ...


在给定的代码中,我们使用浅拷贝(shallow copy)创建了 copy_matrix,这意味着 copy_matrix 是一个新列表,但其元素(子列表)与 matrix 中的子列表是同一个对象。


  1. matrix = [[1, 2], [3, 4]]
  2. copy_matrix = matrix.copy()
  3. matrix[0] = [5, 6]  # 行1
  4. matrix[1][0] = 7  # 行2
复制代码


分析如下:

- 行1:matrix[0] = [5, 6] 修改了 matrix 的第一个元素,使其指向新列表 [5, 6]。由于 copy_matrix 是浅拷贝,它仍然引用原来的子列表 [1, 2],因此 copy_matrix 的内容不变。

- 行2:matrix[1][0] = 7 修改了 matrix 的第二个子列表的第一个元素。由于 copy_matrix 共享同一个子列表对象,所以这个修改也会影响 copy_matrix,使得 copy_matrix[1] 变为 [7, 4]

因此,只有行2会改变两个变量指向的内容(即它们所引用的数据结构中的共享部分)。

答案:B. 只有行2

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

使用道具 举报

发表于 2026-5-28 16:34:27 From FishC Mobile | 显示全部楼层
@FishC 执行以下代码后,len(set([id(a), id(b), id(c)])) 的结果是?

a = [1, 2, 3]
b = a
c = a[:]

A. 1
B. 2
C. 3
D. 0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-28 16:34:34 | 显示全部楼层
killua7w 发表于 2026-05-28 16:34
@FishC 执行以下代码后,len(set()) 的结果是?

a  ...


答案是 D. 0,因为 set() 创建了一个空集合,其长度为 0。

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

使用道具 举报

发表于 2026-6-11 17:10:55 From FishC Mobile | 显示全部楼层
@FishC
如果想创建一个列表的独立副本,以下哪种方式是错误的?
list.copy()
list[:](你的选择)
new_list = list(正确答案)
copy.copy(list)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-11 17:11:02 | 显示全部楼层
制怒者 发表于 2026-06-11 17:10
@FishC
如果想创建一个列表的独立副本,以下哪种方式 ...


你的理解是正确的!new_list = list 并不是独立副本,它只是让新变量指向同一个列表对象,修改其中一个会影响另一个。而 list.copy()list[:] 以及 copy.copy(list) 都能创建列表的浅拷贝,是独立副本(对于嵌套列表要注意,浅拷贝只拷贝外层)。所以错误的选项是 new_list = list

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

使用道具 举报

发表于 2026-6-11 17:15:36 From FishC Mobile | 显示全部楼层
@FishC执行以下代码后,len(set([id(a), id(b), id(c)])) 的结果是?
a = [1, 2, 3]
b = a
c = a[:]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-11 17:17:57 From FishC Mobile | 显示全部楼层
以下代码中,几个变量引用同一个对象?
x = [1]
y = x
z = x[:]
w = y
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-11 17:18:01 | 显示全部楼层
制怒者 发表于 2026-06-11 17:17
以下代码中,几个变量引用同一个对象?
x =
y = x
...


在提问的代码中,xyw 三个变量引用同一个列表对象,而 z 是通过切片复制得到的新列表对象,因此它引用另一个对象。

所以,有 3 个变量引用同一个对象。

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

使用道具 举报

发表于 2026-6-11 17:24:33 From FishC Mobile | 显示全部楼层
执行以下代码,会输出什么?
a = [[]] * 3
a[0].append('FishC')
print(a)
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-11 17:24:41 | 显示全部楼层
制怒者 发表于 2026-06-11 17:24
执行以下代码,会输出什么?
a = [] * 3
a.append(' ...


执行上述代码,输出结果为:[['FishC'], ['FishC'], ['FishC']]

解释如下:
  • [[]] * 3 创建了一个新列表,包含 3 个对同一个空列表对象的引用,而非 3 个独立的空列表。
  • 因此,a[0].append('FishC') 实际上为这个共享的列表添加了元素 'FishC'。
  • 打印 a 时,所有三个元素都指向同一个被修改后的列表,所以显示三个 ['FishC']。


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

使用道具 举报

发表于 2026-6-19 20:00:24 | 显示全部楼层
@FishC 如果想创建一个列表的独立副本,以下哪种方式是错误的?
A. list.copy()
B. list[:]
C. new_list = list
D. copy.copy(list)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-19 20:00:31 | 显示全部楼层
EazyLan 发表于 2026-06-19 20:00
@FishC 如果想创建一个列表的独立副本,以下哪种方式 ...


要创建一个列表的独立副本,以下选项中错误的是 C. new_list = list

原因:
  • A. list.copy()B. list[:] 都是创建列表的浅拷贝,会生成一个新的列表对象,修改新列表不会影响原列表(除非涉及嵌套的可变元素,但就列表本身而言是独立的)。

  • D. copy.copy(list) 同样执行浅拷贝,得到独立的新列表。

  • C. new_list = list 只是将变量 new_list 指向原列表 list 的同一个对象,两者完全共享内存,修改其中一个必然影响另一个,因此无法创建独立副本。


所以正确答案是 C。

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

使用道具 举报

发表于 2026-6-19 20:06:10 | 显示全部楼层
@FishC 以下代码中,几个变量引用同一个对象?

x = [1]
y = x
z = x[:]
w = y

A. 2个
B. 3个
C. 4个
D. 1个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-19 20:06:16 | 显示全部楼层
EazyLan 发表于 2026-06-19 20:06
@FishC 以下代码中,几个变量引用同一个对象?

x = ...


在您提供的代码中,x = [1] 创建了一个列表对象,y = xy 引用同一个对象,z = x[:] 通过切片复制创建了一个新的列表对象,w = yw 引用 y 指向的对象,即原始的列表对象。因此,xyw 三个变量引用同一个对象,而 z 指向另一个独立的对象。所以答案是 B. 3个


  1. x = [1]
  2. y = x
  3. z = x[:]
  4. w = y

  5. # x, y, w 指向同一个列表对象
  6. # z 指向一个新列表对象
复制代码


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

使用道具 举报

发表于 2026-6-19 20:08:04 | 显示全部楼层
@FishC 执行以下代码后,len(set([id(a), id(b), id(c)])) 的结果是?

a = [1, 2, 3]
b = a
c = a[:]

A. 1
B. 2
C. 3
D. 0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-19 20:08:39 | 显示全部楼层
EazyLan 发表于 2026-06-19 20:08
@FishC 执行以下代码后,len(set()) 的结果是?

a  ...


根据代码,a = [1, 2, 3]; b = a; c = a[:] 定义了两个列表变量,但 len(set())set() 是空集合,不包含任何元素,所以长度始终为 0。因此正确答案是 D。这道题容易误以为集合包含 abc,但实际上 set() 没有任何参数。

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

使用道具 举报

发表于 2026-6-19 20:08:46 | 显示全部楼层
@FishC copy 模块中的 copy() 函数相当于以下哪种操作?
A. 变量赋值
B. 列表的 copy() 方法
C. deepcopy()
D. id() 函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-19 20:08:53 | 显示全部楼层
EazyLan 发表于 2026-06-19 20:08
@FishC copy 模块中的 copy() 函数相当于以下哪种操作 ...

正确答案是 B. 列表的 copy() 方法


copy() 函数执行的是**浅拷贝**,即创建一个新对象,但其中的元素仍然是对原对象中元素的引用。这与列表的 copy() 方法效果完全一致。而变量赋值(A)只是增加一个引用,不生成新对象;deepcopy()(C)是深拷贝,会递归复制所有嵌套对象;id()(D)只是返回对象的内存地址,与拷贝无关。

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

使用道具 举报

发表于 2026-6-19 20:09:24 | 显示全部楼层
@FishC 关于切片操作 list[:],以下哪个说法是错误的?
A. 创建列表的浅拷贝
B. 返回新的列表对象
C. 可以用于深拷贝
D. 等同于list.copy()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-6-19 20:09:31 | 显示全部楼层
EazyLan 发表于 2026-06-19 20:09
@FishC 关于切片操作 list,以下哪个说法是错误的?
...


C. 可以用于深拷贝

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-8 12:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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