Python列表元素复制疑问:为何修改B后输出为[5,4]?
问题解析
先一步步拆解代码的执行逻辑:
- 初始状态:
A = [[1, 2], [3, 4]],此时A是包含两个独立列表的外层列表。 A[0] = A[1]:这一步不是复制A[1]的内容,而是让A的第一个元素指向A[1]对应的列表对象。此时A变成[[3, 4], [3, 4]],注意这里两个元素其实是同一个列表的引用,修改其中一个会影响另一个。B = A[:][0]:你对这行的理解有误。A[:]是对A做浅拷贝,生成一个新的外层列表,但里面的元素还是原来的列表引用(也就是那两个指向同一对象的[3,4])。然后[0]是取这个新外层列表的第一个元素,也就是那个共享的[3,4]列表。所以B本质上和A[0]、A[1]指向的是同一个列表对象。B[0] = 5:因为B和A里的两个列表是同一个对象,修改B的第一个元素,会直接改变这个共享列表的内容,此时这个列表变成[5,4]。
所以最终打印时,A是[[5,4],[5,4]],B是[5,4]。
你之前误以为A[:][0]是按列取元素(取每一行的第0个组成新列表),但Python里没有这种直接的按列索引方式。如果要实现取每一行第0个元素组成[3,3],应该用列表推导式:B = [row[0] for row in A],这时候B是一个新列表,修改B的元素不会影响A。
内容的提问来源于stack exchange,提问作者shari
相关产品推荐
相关产品推荐

