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

为何函数中使用列表内置方法会修改原列表,切片却不会?

为什么列表在函数中调用pop()会修改原列表,而切片赋值却不会?

1. pop()方法:直接修改原对象

看这段代码:

my_list = [1, 2, 3]
def change_list(li):
    li.pop()

change_list(my_list)
print(my_list)
# 输出 [1, 2]

列表是可变对象,当你把my_list传入函数change_list时,参数li拿到的是和my_list指向同一个列表对象的引用。

调用li.pop()时,是直接对这个共享的列表对象执行原地修改操作——它会改变对象本身的内容,不会创建新对象。所以函数执行完后,原变量my_list指向的还是这个被修改过的对象,打印出来自然是[1,2]。

2. 切片赋值:改变局部变量的指向,和原对象无关

再看这段切片的代码:

my_list = [1, 2, 3]
def change_list(li):
    li = li[:2]

change_list(my_list)
print(my_list)
# 输出 [1, 2, 3]

当你在函数里执行li = li[:2]时,li[:2]会创建一个新的列表对象(包含原列表的前两个元素),然后把这个新对象的引用赋值给函数内部的局部变量li。

这里要注意:函数内部的li是个局部变量,重新赋值只会改变它自己的指向,不会影响外部的my_list——外部的my_list依然指向原来的那个未被修改的列表对象,所以打印出来还是[1,2,3]。

核心区别总结

  • 调用列表的原地修改方法(如pop()、append()、extend()、sort()):直接修改对象本身,所有指向该对象的变量都会同步看到变化
  • 执行赋值操作(包括切片生成新对象后赋值、直接赋值新列表):仅改变当前作用域内变量的指向,与原对象无关,不会影响外部变量

内容的提问来源于stack exchange,提问作者Sergei Iakimchuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:14