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