函数:
函数的传递:
实参到形参的赋值操作。python中一切皆对象,所有赋值操作都是‘引用的赋值’所以,python中的参数传递都是引用传递,不是值传递。具体操作入下:
1.对可变对象进行‘写操作’,直接作用于对象本身。
2.对不可变对象进行‘写操作’,会产生一个新的‘对象空间’,并用新的值填充这块空间(起到其它语言的值传递效果但不是值的传递)
可变对象:字典,列表,集合,自定义对象。。。
不可变对象: 数字,字符串,元组,function等
可变对象的传递:
b=[10]
print('b',id(b))
def f2(m):
print('m',id(m))
m.append(30)
f2(b)
print("b",id(b))
print('b',b)
#结果:
b 3052882874880
m 3052882874880
b 3052882874880
b [10, 30]
在实参b赋值给形参m之后b所对应的地址与m所对应的地址一致即‘3052882874880’堆中的对应属性为‘10’,在函数变化中列表新增加了元素‘30’后由于列表为可变序列所以地址不变但列表值发生改变,即b所对应的堆的id中的属性变为[10,30]。
不可变对象的传递:
b=10
print('b',id(b))
def f2(m):
print('m',id(m))
n=m+100
print('n',id(n))
f2(b)
print("b",id(b))
print('b',b)
结果:
b 1576936210960
m 1576936210960
n 1576936214160
b 1576936210960
b 10
在不可变对象中,若实参赋值给形参,栈中的实参在堆中的地址会赋值给栈中的形参。但在函数内部的局部参数的‘n’由于不可改变原位置的属性,所以会重新选择一个位置进行储存新属性,所以‘n’的位置会发生改变,由于m和b的id不变并且属性不变所以输出的b依旧为‘10’