可变类型传参(列表)
def change_list(li, num, val):
li[num] = val
l1 = [1, 2, 3, 4]
change_list(l1, 3, 5)
print(l1)
#结果
[1, 2, 3, 5]
由这里可以看出,python对于可变参数的传参方式为对象引用,假如l1在创建时指向的是内存的地址为A1. 即这里的传参相当于 li = l1>>A1 , 此时li 和l1指向同一块内存地址,所以li改变l1也改变。
其实所谓的改变实质是改变列表中存储的内存地址,如创建列表l1,则会在内存中开辟一块A1的内存地址,然后再开辟四块内存地址分别存储值[1,2,3,4],然后A1中分别存储这四个值的内存地址。当将列表中的4改变为5时,其实是开辟一块内存地址,存储值5, 而原来存储值4内存地址的内存地址,现在改为存储指向值5的内存地址
不可变类型传参(字符串)
def change_string(s, num, val):
s[num] = val
s = 'abc'
print(change_string(s, 2, 'd'))
print(s)
#结果
TypeError: 'str' object does not support item assignment
报错:因为字符串是不可变类型,我们不能直接更改原对象
改为如下代码:
def change_string(s, num, val):
new_s = ''
for index, value in enumerate(s):
if index == num:
value = val
new_s += value
return new_s
s1 = 'abc'
print(change_string(s1, 2, 'd'))
print(s1)
# 结果
abd
abc
由这里可以看出,python对于不可变类型的传参方式可以看为传值,因为不可对源对象进行修改,只能用源对象的值
总结
python的传参方式可以统一的看为“对象引用”,这种方式是传值和传引用的一种综合。
但是区分:可变参数或不可变参数。
如果是可变参数(列表,字典,集合)则相当于传引用的方式,可以对原始的对象进行修改。
如果是不可变参数(字符串、数字)等,则相当于传值的方式。不可以对原对象进行修改
本文探讨了Python中可变和不可变参数的传递方式。对于列表等可变对象,函数内部的修改会影响原始对象,因为它们是按引用传递。而对于字符串等不可变对象,尝试修改会导致TypeError,因为它们是按值传递。通过示例展示了如何在函数中改变不可变对象,并总结了Python参数传递的本质是对象引用,但根据参数类型表现为传值或传引用。
4527

被折叠的 条评论
为什么被折叠?



