为什么只有第二种Python函数写法能修改传入的原始实参?
核心原因
Python参数采用传对象引用的传递规则,两个函数的差异本质是对参数的操作类型完全不同:
- 第一种实现
make_great:
函数内部的列表推导式会生成一个全新的列表对象,后续的赋值语句magicians = ['The Great '+ i for i in magicians]只是修改了函数作用域内的局部变量magicians的绑定指向,把它从指向外部传入的原始列表,改成了指向新生成的列表。这个操作全程没有修改原始列表的内容,因此外部实参不会发生变化。 - 第二种实现
make_great2:
全程没有修改局部变量magicians的绑定指向,始终指向外部传入的原始列表对象,通过下标magicians[i] = 'The great '+ magicians[i]的操作是直接对原始列表做原地修改,操作的就是外部实参对应的同一个内存对象,因此外部的原始实参会同步被修改。
你可以用以下代码验证效果:
magicians = ['张三', '李四'] make_great(magicians) print(magicians) # 输出:['张三', '李四'],无变化 make_great2(magicians) print(magicians) # 输出:['The great 张三', 'The great 李四'],已被修改
内容的提问来源于stack exchange,提问作者ChadMeng
相关产品推荐
相关产品推荐

