Python将列表对象传入函数后修改行为不一致的原因咨询
两段Python代码运行差异的原因
Python的参数传递规则为传对象引用:函数调用时不会复制传入的对象本身,函数内的参数变量和外部传入的变量初始指向内存中的同一个对象,最终运行效果的差异完全取决于你对参数变量执行的操作类型。
第一段代码逻辑说明
对应代码:
temp = [1, 2, 3] def add_more(l): l.append(5) add_more(temp) print(temp)
运行后原temp被修改的原因:
- 调用
add_more(temp)时,函数内局部变量l和外部的temp指向同一个列表对象[1, 2, 3] l.append(5)属于原地修改操作,直接在指向的列表对象末尾新增元素,没有改变l本身的指向,所以修改会直接作用到原对象上,外部temp访问同一对象时会得到更新后的结果[1, 2, 3, 5]
第二段代码逻辑说明
对应代码:
temp = [1, 2, 3] def add_more(l): l = [] add_more(temp) print(temp)
运行后原temp无变化的原因:
- 函数调用初始阶段,局部变量
l同样和temp指向同一个列表对象 l = []属于重新赋值操作:会在内存中新建一个空列表对象,再将局部变量l的指向修改为这个新的空列表,该操作仅修改局部变量l本身的指向,完全不会触碰原列表对象,所以外部temp的指向没有任何变化,输出仍为[1, 2, 3]
核心差异总结
- 对列表、字典这类可变对象执行
append/pop/extend等原地修改方法时,修改会作用到原对象,外部可见 - 对参数变量直接执行
=赋值操作时,仅修改函数内局部变量的指向,不会影响外部原变量和对应的对象
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

