Python变量引用拷贝
目录
题目回顾
逐步分析代码执行过程
变量最终状态
关键点
题目回顾
题目给出了以下Python代码,要求判断关于变量a
、b
、c
、d
值的描述中错误的选项:
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')
选项:
- Ⓐ
a == [1,2,3,4,['a','b','c'],5]
- Ⓑ
b == [1,2,3,4,['a','b','c'],5]
- Ⓒ
c == [1,2,3,4,['a','b','c']]
- Ⓓ
d == [1,2,3,4,['a','b','c']]
正确答案是 D
逐步分析代码执行过程
-
初始赋值:
a = [1, 2, 3, 4, ['a', 'b']] # a是一个列表,包含嵌套列表['a', 'b']
-
直接赋值(
b = a
):b
是a
的别名(引用同一个对象),因此b
和a
完全同步。- 修改
a
或b
会直接影响另一个。
-
浅拷贝(
c = copy.copy(a)
):- 浅拷贝会创建一个新列表
c
,但嵌套列表(a[4]
)仍然是共享的。 - 修改
a
的外层(如a.append(5)
)不会影响c
,但修改嵌套列表(如a[4].append('c')
)会影响c
。
- 浅拷贝会创建一个新列表
-
深拷贝(
d = copy.deepcopy(a)
):- 深拷贝会完全复制
a
及其所有嵌套对象,因此d
与a
完全独立。 - 后续对
a
的任何修改都不会影响d
。
- 深拷贝会完全复制
-
修改操作:
a.append(5)
:在外层列表末尾添加5
,影响a
和b
,但不影响c
和d
。a[4].append('c')
:在嵌套列表['a', 'b']
中添加'c'
,影响a
、b
和c
(因为c
是浅拷贝,共享嵌套列表),但不影响d
。
变量最终状态
a
:[1, 2, 3, 4, ['a', 'b', 'c'], 5]
(外层添加5
,嵌套列表添加'c'
)b
:和a
相同(b = a
,完全同步)。c
:[1, 2, 3, 4, ['a', 'b', 'c']]
(浅拷贝不复制嵌套列表,因此a[4]
的修改会影响c
)d
:[1, 2, 3, 4, ['a', 'b']]
(深拷贝完全独立,不受a
的修改影响)
关键点
- 直接赋值(
b = a
):完全共享。 - 浅拷贝(
copy.copy
):只复制外层,嵌套对象共享。 - 深拷贝(
copy.deepcopy
):完全独立复制。
正确答案是 D,因为d
的嵌套列表不会被修改。