Python中为何将子列表存为变量后追加内容会影响原列表?
Python列表子列表赋值修改影响原列表的原因解析
示例代码
destinations = ["Paris, France", "Shanghai, China", "Los Angeles, USA", "Sao Paulo, Brazil", "Cairo, Egypt"] test_traveler = ['Erin Wilkes', 'Shanghai, China', ['historical site', 'art']] def get_destination_index(destination): destination_index = destinations.index(destination) return destination_index def get_traveler_location(traveler): traveler_destination = traveler[1] traveler_destination_index = get_destination_index(traveler_destination) return traveler_destination_index attractions = [[] for place in destinations] def add_attraction(destination, attraction): destination_index = get_destination_index(destination) attractions_for_destination = attractions[destination_index] attractions_for_destination.append(attraction) add_attraction("Los Angeles, USA", ['Venice Beach', ['beach']]) print(attractions)
运行输出
[[], [], [['Venice Beach', ['beach']]], [], []]
问题描述
在
add_attraction函数中,将attractions列表的子列表赋值给attractions_for_destination变量,向该变量追加元素时,原attractions列表也随之更新。请问为何操作该子列表变量会影响原列表?是否操作子列表变量都会同步影响原列表?
解答
这核心是Python里可变对象的引用机制在起作用:
- 当执行
attractions_for_destination = attractions[destination_index]时,并没有复制attractions里的子列表,而是让attractions_for_destination成为原列表中子列表的“别名”——两者指向内存中同一个列表对象。 - 调用
attractions_for_destination.append(attraction)属于对列表的原地修改,本质是直接操作原列表里的那个子列表,所以原列表会同步更新。
关于操作子列表变量是否都会影响原列表,要分两种情况:
- 若执行的是原地修改操作(比如
append()、extend()、pop(),或者索引赋值list[0] = 'new'),则会影响原列表,因为操作的是同一个对象。 - 若给变量重新赋值新列表(比如
attractions_for_destination = ['new item']),则不会影响原列表——此时变量指向了新的内存地址,和原列表的子列表没有关系了。
内容的提问来源于stack exchange,提问作者Hani
相关产品推荐
相关产品推荐

