python中的值传递和引用传递
可参考链接:Python3 函数 | 菜鸟教程 (runoob.com)
在Python中,参数传递可以被视为一种"传值"机制,但这种"传值"与一些其他语言中的传值有所不同,特别是涉及到可变和不可变类型时。以下是对Python中值传递和引用传递的详细解释:
值传递(Immutable Objects)
对于不可变类型(如整数、浮点数、字符串、元组等),当你将它们作为参数传递给函数时,实际上是传递了它们的值的一个副本。这意味着函数接收到的是这个值的副本,而不是原始对象的引用。因此,函数内部对这个参数的修改不会影响到原始对象。
def modify_value(a):
a = 10
x = 5
modify_value(x)
print(x) # 输出: 5
在这个例子中,函数modify_value
修改了参数a
的值,但这个修改不影响原始变量x
,因为a
是x
值的一个副本。
引用传递(Mutable Objects)
对于可变类型(如列表、字典、集合等),当你将它们作为参数传递给函数时,实际上是传递了它们的引用的副本。这个引用指向内存中相同的对象。因此,如果你通过这个引用修改了对象,这种修改会影响到所有引用这个对象的变量。
示例:
def modify_list(lst):
lst.append(4)
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # 输出: [1, 2, 3, 4]
在这个例子中,my_list
被传递给函数modify_list
,函数内部对列表进行了修改。由于列表是可变的,这个修改也反映在了原始的my_list
上。
重要区别
- 不可变类型:函数内部对参数的修改不会影响原始对象,因为参数是原始值的副本。
- 可变类型:函数内部对参数的修改会影响原始对象,因为参数是指向原始对象的引用的副本。