Python中函数修改列表却不修改普通变量的原因是什么?
Python中列表与普通变量作为函数参数的差异原因
测试案例与现象
列表作为参数的情况
def test(a): a.append(1000) return a def main(): a = [1,2,3] print(a, test(a)) main()
输出结果:
[1,2,3,1000] [1,2,3,1000]
整数作为参数的情况
def test(a): a = a + 10 return a def main(): a = 5 print(a, test(a)) main()
输出结果:
5 15
差异的核心原因
Python的对象分为可变对象和不可变对象,函数参数传递的是对象的引用,这直接导致了两种类型的表现差异:
不可变对象(如整数、字符串、元组):
这类对象创建后无法修改内部内容。函数中执行a = a + 10时,并没有修改原有的整数对象5,而是生成了一个新的整数对象15,并让函数内的局部变量a指向这个新对象。外部的变量a仍指向原对象5,因此不会被改变。可变对象(如列表、字典、集合):
这类对象允许修改内部元素。当列表传入函数后,函数内的参数a和外部的a指向同一个列表对象。调用a.append(1000)是直接对这个共享对象的内容进行修改,所以外部的列表也会同步看到变化。
避免修改原列表的方法
如果不想让函数改动原列表,可以在传入时创建列表的副本:
def main(): a = [1,2,3] print(a, test(a.copy())) # 或使用 test(a[:]) 创建切片副本
此时函数修改的是副本,原列表内容保持不变。
内容的提问来源于stack exchange,提问作者Bianca I.
相关产品推荐
相关产品推荐

