Python之旅——函数传参

函数参数传值

更多文章,请移步☞ https://gitee.com/youngzhiyong/book

Python一切皆对象!!!

函数参数传值,函数形参作为对象的引用(形参指向实参对象)。

a.常量对象作为函数参数

常量对象是一个不可变的对象。当对形参再次赋值时,是形参变量指向一个另外的对象。

def update(num):
    print("num_addr: 0x%x" % id(num), f"num_value:{num}") # id函数是输出对象地址
    num = 5
    print("num_addr: 0x%x" % id(num), f"num_value:{num}")

print("%d object addr:0x%x" % (3, id(3)))
print("%d object addr:0x%x" % (5, id(5)))

a = 3
print("a addr: 0x%x" % id(a), f"value:{a}")
update(a)
print("a addr: 0x%x" % id(a), f"value:{a}"

输出结果:

3 object addr:0x61f96480
5 object addr:0x61f964a0
a addr: 0x61f96480 value:  3
num_addr: 0x61f96480 num_value:  3
num_addr: 0x61f964a0 num_value:  5
a addr: 0x61f96480 value:  3

b.可变对象作为函数参数

函数形参指向可变对象。使用可变对象的函数方法改变可变对象中的值。同样,对形参再次赋值,形参会指向一个新的对象。

def update(num):
    print("num_addr: 0x%x" % id(num), f"num_value:{num}")
    num.append(5) # 可变对象中新增一个值
    num[0] = 10   # 实际调用num.__setitem__函数
    print("num_addr: 0x%x" % id(num), f"num_value:{num}")

    num = [5] # 参数指向一个新的可变对象
    print("num_addr: 0x%x" % id(num), f"num_value:{num}")


a = [3]
print("a addr: 0x%x" % id(a), f"value:{a}")
update(a)
print("a addr: 0x%x" % id(a), f"value:{a}")

输出结果:

a addr: 0x13e45d0 value:[3]
num_addr: 0x13e45d0 num_value:[3]
num_addr: 0x13e45d0 num_value:[10, 5]
num_addr: 0x13e4a58 num_value:[5]
a addr: 0x13e45d0 value:[10, 5]

c.可变对象作为函数默认参数

  • 若在调用函数时,向含有默认参数的形参传值,与b情形相同;
  • 若在调用函数时,未向默认参数位置传值,则形参指向默认的可变对象地址,并且多次调用,均指向同一个可变对象。

注:函数默认参数,在模块加载时就创建了默认参数对象,比如下例中的[]列表对象

def num_default(num = []):
    print("num_addr: 0x%x" % id(num), f"num_value:{num}")
    num.append(5)
    print("num_addr: 0x%x" % id(num), f"num_value:{num}")

num_default()
print("-"*40)
num_default() 

输出结果:

num_addr: 0x7445d0 num_value:[]
num_addr: 0x7445d0 num_value:[5]
----------------------------------------
num_addr: 0x7445d0 num_value:[5]
num_addr: 0x7445d0 num_value:[5, 5]

建议:

默认参数对象,不能是可变参对象,可以是None或者不可变对象(数字,字符串和元组)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值