实参到形参的赋值 *** 作。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’
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)