一、别人的结论
http://c.biancheng.net/view/4471.html
python中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
(1) 值传递:适用于实参类型为不可变类型(字符串、数字、元组);
(2) 引用(地址)传递:适用于实参类型为可变类型(列表,字典);
二、我的结论,都是引用传递
#coding:utf-8
def mytest(it):
print("刚传参过来的内存地址:", id(it))
if isinstance(it,str):
it="22"
elif isinstance(it,list):
it=[1,2,3]
elif isinstance(it, tuple):
it=(1,2)
else:
it +=55
print("改变后的内存地址:",id(it))
if __name__=="__main__":
tt = 1
print("实参内存地址:",id(tt))
mytest(tt)
tt = "22"
print("实参内存地址:",id(tt))
mytest(tt)
ii=(1,2)
print("实参内存地址:",id(ii))
mytest(ii)
ii=[1,2,3]
print("实参内存地址:",id(ii))
mytest(ii)
一个运行结果:
D:\python3.6.7\python.exe E:/桌面/test.py
实参内存地址: 1482320640
刚传参过来的内存地址: 1482320640
改变后的内存地址: 1482322400 #数值改变了,地址也改变
实参内存地址: 1607169587160
刚传参过来的内存地址: 1607169587160
改变后的内存地址: 1607169587160 #重新赋值"22"字符串,地址不变
实参内存地址: 1607169696584
刚传参过来的内存地址: 1607169696584
改变后的内存地址: 1607169696520 #重新赋一样的值(1,2),地址却变了
实参内存地址: 1607169679816
刚传参过来的内存地址: 1607169679816
改变后的内存地址: 1607169607688 #重新赋值赋一样的值[1,2,3],地址也变了
三、结论
(1)python函数传参传的都是引用
(2)python用把数字、字符、字符串当成常量了,地址不变,tuple虽然是不可变的,但是还是算对象,值一样,每次地址却不一样。
#字符、数字、字符串 地址一样
>>> id('a')
2940085726880
>>> a='a'
>>> id(a)
2940085726880
>>> id(88)
1482323424
>>> b=88
>>> id(88)
1482323424
>>> id("998")
2940123811208
>>> c="998"
>>> id(c)
2940123811208
#tuple每次使用地址都不一样(会碰到一样的情况)
>>> id((1,2,3))
2940123930056
>>> d=(1,2,3)
>>> id(d)
2940124492424
>>> id((1,2,3))
2940124460016
>>> id((1,2,3))
2940123930056
>>> id((1,2,3))
2940124459584
小结:常量会被保存着,python没结束就一直存在 。 而对象(临时对象)用完了生命周期就结束了。