python函数传引用 python引用传递和值传递

python 引用python引用有哪些?来和我一起解读一下吧~
python不允许程序员用传值和传引用,可以选择选用“传对象引用”的方式,这种方式等同于将传值和传引用综合起来,如果函数收到的是一个可变对象的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象,如果函数收到的是一个不可变对象的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象 。
python引用主要有:不可变数据引用和可变数据引用,其中不可变数据引用包括:字符串String、浮点型Float、元祖Tuple 。
1、字符串String
#1.字符串引用a='1234'b=aa='hello'print('a:',a) #a:helloprint('b:',b)#b:1234#查看内存地址print('a的内存地址是:',id(a))print('a的内存地址是:',id(b))结果是:a: hellob: 1234a的内存地址是: 1651738050720a的内存地址是: 1651737219456分析:b的值指向a的值 。python开辟了新的内存空间给b,所以a和b的内存地址不一样 。
2、浮点型Float
【python函数传引用 python引用传递和值传递】#2.浮点型引用x=3.14y=xx=9.88print('x:',x)print('y:',y)print('x的内存地址是:',id(x))print('y的内存地址是:',id(y))结果是:x: 9.88y: 3.14x的内存地址是: 2578075558248y的内存地址是: 2578075558008
3、元祖Tuple
元祖虽然是序列,且包含多个元素,但是不支持原处修改 , 如tuple[1]=1是非法的 。#3.元祖引用t1=(1,2,3,4,5)t2=t1t1=('tuple','hello')print('t1:',t1)print('t2:',t2)print('t1的内存地址是:',id(t1))print('t2的内存地址是:',id(t2))结果是:t修改后为: (1, 2, 3, ['x', 'a', 'D', 'b'])可变数据引用包括:列表引用、字典引用、函数的传递引用
1、列表引用
#4 列表的可变引用list1=[1,2,3,4,5]list2=list1list1[3]='list'print('list1=====%s'%list1)print('list2=====%s'%list2)print('list1的内存地址是:',id(list1))print('list2的内存地址是:',id(list2))结果是:list1=====[1, 2, 3, 'list', 5]list2=====[1, 2, 3, 'list', 5]list1的内存地址是: 2769992249864list2的内存地址是: 2769992249864
2、函数的传递引用
def eggs(someParameter):someParameter.append('hello list')spam=[1,2,3,4]eggs(spam)print(spam)结果是:[1, 2, 3, 4, 'hello list']
3、字典引用#5 字典的引用a={'name':'Cathy','age':'27','job':'coder'}b=aa['age']='30'b['name']='Bob'print('a======%s'%a)print('b======%s'%b)print('a的内存地址是:', id(a))print('b的内存地址是:', id(b))结果是:a======{'name': 'Bob', 'age': '30', 'job': 'coder'}b======{'name': 'Bob', 'age': '30', 'job': 'coder'}a的内存地址是: 2510825602792b的内存地址是: 2510825602792
python中变量的引用、可变和不可变类型、局部变量和全局变量变量的引用
变量和数据都是保存在内存中的
变量和数据是分开存储的
数据保存在内存中某个位置python函数传引用,通过地址来标记
变量保存的是数据的地址,通过地址可以找到数据在内存空间的位置
把变量保存数据地址的过程称为引用
变量的重新赋值修改的是变量中引用数据的内存地址
变量之间的赋值实际是引用的传递
函数参数的传递,本质也是引用的传递
函数的返回值本身也是引用的传递
可变和不可变类型
不可变类型,内存中的数据不允许被修改python函数传引用:数字类型(int,bool,float,complex,long(2,x)、字符串、元组(tuple)
可变类型,内存中的数据可以被修改:列表list、字典dict
无论是可变还是不可变数据类型,通过赋值语句,都会改变变量的引用
Hash函数只能接收不可变数据类型,字典的键也只能是不可变数据类型,字典的value值可以是任意数据类型
局部变量

推荐阅读