函数参数传值
更多文章,请移步☞ 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或者不可变对象(数字,字符串和元组)