为何函数中使用列表内置方法会修改原列表,切片却不会?
为什么列表在函数中调用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
相关产品推荐
相关产品推荐

