引用
定义 :就是程序中的数据在内存中的一个地址,简称内存地址 。扩展 :程序中所使用的数据都保存在内存中,变量保存其实就是数据在内存中的一个地址,以后根据内存地址在内存中获取对应的数据。举例 :a = 1
严格来说定义了一个变量a
,保存的是数据1
在内存中的一个地址;通俗来说保存的就是数据1
的内存地址。
id()
函数
作用 :查看 变量的内存地址 注意 :id
函数获取的内存地址是十进制的,不是16进制的。
a = 1
print ( "变量a:" , id ( a) , hex ( id ( a) ) )
b = a
print ( "变量b:" , id ( b) , hex ( id ( b) ) )
a = 2
print ( "变量a:" , id ( a) , hex ( id ( a) ) , a)
print ( "变量b:" , id ( b) , hex ( id ( b) ) , b)
可变类型和不可变类型引用的内存地址变化
可变类型和不可变类型就是看数据更改后,内存地址是否发生变化。
可变类型
可以在原有内存空间的基础上修改数据(添加、删除、修改数据),修改后内存地址不变 。 可变类型有:列表 、字典 、集合 扩展 :对于可变类型来说,修改变量保存的数据有两种方式
在原有内存空间的基础上修改数据,内存地址不变 重新赋值,注意:变量保存的内存地址会发生变化。
不可变类型
不允许在原有内存空间的基础上修改数据,修改(这里的修改只能是重新赋值)后内存地址改变 。 不可变类型有:字符串 、元组 、数字 扩展 :对于不可变类型来说,修改变量只能重新赋值。
my_list = [ 1 , 2 ]
print ( "修改前:" , my_list, id ( my_list) )
my_list. append( 3 )
print ( "修改后:" , my_list, id ( my_list) )
my_list = [ 3 , 4 ]
print ( "重新赋值后:" , my_list, id ( my_list) )
my_str = "abc"
print ( "修改前:" , my_str, id ( my_str) )
my_str = "adc"
print ( "修改后:" , my_str, id ( my_str) )
引用传递
在Python里面所有的赋值操作都是引用传递,赋的值本质是一个内存地址。 函数传参,也是按照引用进行传递的。
+=
和=
的区别
+=
:本意是在原有内存空间的基础上要修改数据。
如果param
是不可变类型,+=
操作是不能在原有内存空间的基础上修改数据,它完成重新开辟一个新的内存空间存储计算后的结果,所以内存地址会发生变化。 如果param
是可变类型,+=
操作是可以在原有内存空间的基础上修改数据的,修改数据后内存地址不变。
=
:表示赋值操作,不管是可变类型还是不可变类型,重新赋值内存地址都会发生变化。
def show ( param) :
print ( "传递进函数后数据param:" , param, id ( param) )
param += param
print ( "+=操作后param:" , param, id ( param) )
param = param + param
print ( "=操作后param:" , param, id ( param) )
a = [ 100 ]
print ( "原始数据a:" , a, id ( a) )
show( a)