在Python中,函数参数传递的是对象的引用,而不是对象本身。根据对象是否可变(mutable),其行为会有所不同:
不可变对象:如 `int`, `float`, `str`, `tuple`, `bool`。当你将不可变对象传递给函数时,函数内部会创建该对象的一个副本。因此,在函数内部更改该副本不会影响原始对象。
可变对象:如 `list`, `dict`, `set`。当你将可变对象传递给函数时,函数内部操作的是原始对象的引用,所以函数内部对对象的任何修改都会影响原始对象。
下面是一个简单的例子来说明这个概念:
def change_str(s):
s = "inside" 只改变了s的副本,不影响原始字符串
return s
original_str = "outside"
new_str = change_str(original_str)
print(original_str) 输出 "outside"
print(new_str) 输出 "i"
在这个例子中,`change_str` 函数接收一个字符串 `s`,然后创建了一个新字符串,只包含 `s` 的第一个字符。由于字符串是不可变的,函数内部的 `s` 只是原始字符串的一个副本,所以原始字符串 `original_str` 保持不变。
如果你需要在函数内部修改原始对象,你需要明确地传递对象的引用,并确保函数内部的操作能够修改原始对象。例如,对于列表,你可以这样做:
def change_list(l):
l = "inside" 直接修改了原始列表的第一个元素
return l
original_list = ["outside"]
new_list = change_list(original_list)
print(original_list) 输出 ['inside']
print(new_list) 输出 ['inside']
在这个例子中,`change_list` 函数接收一个列表 `l`,并直接修改了列表的第一个元素。由于列表是可变的,原始列表 `original_list` 的内容也被修改了。
希望这能帮助你理解Python中对象传递的行为