面试题答案
一键面试-
内存变化情况:
a
的内存变化:a
原本指向一个包含两个子列表的列表对象。当修改a[0][0]
为5时,a
所指向的列表对象中第一个子列表的第一个元素被改变。由于列表是可变对象,这种修改直接在原内存位置进行。b
的内存变化:b
是通过浅拷贝得到的,浅拷贝只复制了外层列表对象,而内层子列表仍然是引用。所以当a[0][0]
被修改时,因为b
中第一个子列表与a
中第一个子列表指向同一个内存位置,b
中的b[0][0]
也会随之变为5。
-
它们之间的关系:
a
和b
是不同的列表对象(即id(a) != id(b)
),因为浅拷贝创建了一个新的外层列表。- 但是它们内部的子列表是共享的,即
id(a[0]) == id(b[0])
且id(a[1]) == id(b[1])
。所以对a
中某个子列表元素的修改会反映到b
中相应子列表的相同位置元素上。
示例代码验证(Python):
import copy a = [[1, 2], [3, 4]] b = copy.copy(a) a[0][0] = 5 print(a) print(b)
输出:
[[5, 2], [3, 4]] [[5, 2], [3, 4]]