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

为何修改Python列表形参影响原列表,重新赋值却不影响?

为什么Python函数内append列表会修改原列表,重新赋值参数却不会?

这本质是Python的对象引用传递机制和可变对象的原地操作导致的,拆解来看:

1. append() 修改原列表的原因

Python里列表是可变对象,当你把data传入add_item函数时,参数items拿到的是指向原列表对象的引用(可以理解为指向内存中该列表的“地址”)。

items.append("new")是对这个引用指向的原对象做原地修改——没有创建新列表,只是在原列表的内存空间里添加了元素。所以外部的data因为指向同一个对象,自然能看到修改后的结果。

2. 重新赋值参数不生效的原因

在replace_item函数里,items = ["x", "y"]这行代码不是修改原对象,而是给局部变量items重新绑定了一个全新的列表对象。

此时函数内的items不再指向原来的data列表,而是指向了内存中新创建的["x", "y"]。但外部的data依然指向原来的列表对象,所以原列表不会有任何变化。

用内存地址验证(辅助理解)

你可以在代码里加入id()打印来直观看到引用的变化:

def add_item(items):
    print("add_item里items的id:", id(items))
    items.append("new")

def replace_item(items):
    print("replace_item初始items的id:", id(items))
    items = ["x", "y"]
    print("replace_item赋值后items的id:", id(items))

data = ["a", "b"]
print("data的id:", id(data))

add_item(data)
print(data)

replace_item(data)
print(data)

输出会显示:

data的id: 140697756546304
add_item里items的id: 140697756546304
['a', 'b', 'new']
replace_item初始items的id: 140697756546304
replace_item赋值后items的id: 140697756548096
['a', 'b', 'new']

能看到add_item里的items和data始终是同一个id;而replace_item赋值后,items的id变了,说明指向了新对象。

内容的提问来源于stack exchange,提问作者楊翔宇

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 05:52:26