关于python的传参

可变类型传参(列表)

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的传参方式可以统一的看为“对象引用”,这种方式是传值和传引用的一种综合。

但是区分:可变参数或不可变参数。

如果是可变参数(列表,字典,集合)则相当于传引用的方式,可以对原始的对象进行修改。

如果是不可变参数(字符串、数字)等,则相当于传值的方式。不可以对原对象进行修改

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
型有哪些?如何进行参数传递? Python传参型有四种:位置参数,关键字参数,默认参数和可变参数。 位置参数:按照函数定义中形参的位置进行传递,与形参的名称无关。 关键字参数:按照形参的名称进行传递,与形参的位置无关。 默认参数:在函数定义时指定参数的默认值,如果调用时传递了参数,则使用传递的值,否则使用默认值。 可变参数:有两种,分别是可变位置参数和可变关键字参数。可变位置参数在函数定义时以*args形式声明,接收任意数量的位置参数;而可变关键字参数在函数定义时以**kwargs形式声明,接收任意数量的关键字参数。 参数的传递方式:位置参数和关键字参数可以混合使用,但是位置参数必须在关键字参数之前传递。例如: ``` def add(x, y=1, z=2): result = x + y + z return result add(1, z=3) # 返回 5 ``` 这里函数add()有三个参数,其中y和z指定了默认值。我们可以像这样传递参数:add(1, z=3),这里指定了x为1,z为3,y使用默认值1. 可变参数可以使用*和**运算符来实现参数的解包,例如: ``` def add(*args): result = 0 for arg in args: result += arg return result numbers = [1, 2, 3] add(*numbers) # 返回 6 def print_info(**info): for key, value in info.items(): print("{}: {}".format(key, value)) user_info = {"name": "Alice", "age": 18} print_info(**user_info) # 输出 name: Alice, age: 18 ``` 这里函数add()接收任意数量的位置参数,函数print_info()接收任意数量的关键字参数。我们可以使用*运算符将列表或元组解包作为位置参数传递给函数,使用**运算符将字典解包作为关键字参数传递给函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值