Python 学习日记day 20

Python 学习日记day 20,第1张

Python 学习日记day 20 函数: 函数的传递:

                实参到形参的赋值 *** 作。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’

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存