编程后端开发者

Python中的参数传递机制是如何工作的(通过对象引用传递/共享传递)?这对可变和不可变类型有什么影响,如何避免意外改变?

用 Hintsage AI 助手通过面试

答案。

在Python中,参数是通过'call by object reference'(或'call by sharing')的原则传递的。这意味着函数接收对象的引用,而不是对象本身。如果对象是可变的(mutable),则可以在函数内部更改其内容,并且这些更改会反映在外部变量上。对于不可变对象(immutable),例如数字或字符串,在函数内部的更改会创建一个新对象,而不会影响原始对象。

可变对象的示例:

def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]

不可变对象的示例:

def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5

隐含的问题。

问题: "在Python中,变量是通过引用还是值传递给函数的?"

答案: 既不是,也不是在传统意义上。变量传递的是对对象的引用,而不是变量本身,并且无法为外部变量替换对象。

由于对主题细微之处的不了解而导致的实际错误示例。


故事 在一个数据解析项目中,函数用于过滤列表。函数内部没有创建新列表,而是通过修改原始列表进行过滤。这导致原始数据被删除——经过几次脚本执行后,数据就没有了。


故事 一位初级开发者认为字符串可以在函数内部通过“引用”进行修改,因为其他参数(列表)可以被修改。结果,在调用函数后,程序没有得到预期的变化(字符串没有改变),这导致了不可理解的bug。


故事 在REST API中,为了过滤输入数据,开发者忘记复制参数字典,在验证时值被“丢失”——参数从原始对象中被删除,导致后续请求的逻辑被破坏。