Python 函数参数传递机制(都是引用(地址)传递)

一、别人的结论

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没结束就一直存在 。 而对象(临时对象)用完了生命周期就结束了。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值