You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:03:10