引用
概念
-
变量 和 数据 都是保存在内存中的
-
在 Python 中,函数 的参数传递和返回值 都是靠 引用 传递的
-
变量 和 数据是分开存储的
-
数据 保存在内存中的一个位置
-
变量 中记录数据的地址,就叫 引用
-
使用 id() 函数可以查看变量中保存数据所在的 内存地址
注: 如果变量已经被定义,当给一个变更 重新赋值的时候,本质上是 修改了数据的引用
示例
a=1
print(id(a))
print(id(1))
b=a
print(id(b))
a=2
print(id(a))
输出结果:从这里面可以看出 前三个的内存地址是一样的
函数的参数传递与返回值的引用
def test(num):
print("传递的值是:%d,内存地址是:%d" %(num,id(num)))
result="test"
print("返回的值是:%s,内存地址是:%d" %(result,id(result)))
return result
a=1
print("需要传递的参数的值是:%d,内存地址是:%d"%(a,id(a)))
ss=test(a)
print("调用函数获取的返回值是:%s,内存地址是:%d" %(ss,id(ss)))
输出结果
结论:从结果中可得知,在调用函数时,传入的变量,实际上是将变量的引用内存地址 传递进去了。函数在返回时,同样是将变量对应的 引用 返回出来了
可变和不可变类型
-
不可变类型,即内存中的数据不允许被修改
-
数字类型:int 、bool、float、complex、long
-
字符串 str
-
元组 tuple
-
-
可变类型,即内存中的数据可以被修改
-
列表 list
-
字典 dict
-
集合 set
-
示例
# 不可变数据类型
a=1
print("内存地址是:%d" %id(a))
a=2
print("内存地址是:%d" %id(a))
#可变数据类型
b=[1,2,3]
print("内存地址是:%d" %id(b))
b.append(4)
print("值是:%s,内存地址是:%d" %(b,id(b)))
#如果重新用 = 赋值,则会新建一块内存地址
b=[]
print("新内存地址是:%d" %id(b))
输出结果
结论:
-
可变类型的数据变化,是通过方法来 实现的
-
如果给一个可变类型的变量,赋值了一个新的数据,引用的地址则会不同
哈希(hash)
-
Python 中内置有一个名字叫做 hash() 的函数
-
接收一个 不可变类型 的数据作为参数
-
返回 结果是一个整数
-
-
哈希是一种算法,其作用就是提取数据的特征码(类似指纹)
-
相同的内容 得到 相同的结果
-
不同的内容 得到 不同的结果
-
-
在 Python 中,设置字典的键值对时,会首先对 key 进行 hash ,用来决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查
-
键值对的 key 必须是不可变类型的数据
-
键值对的 value 可以是任意类型的数据
-
# 对同一个不可变的数据类型,hash 两次,得到的结果是一样的
print(hash("123"))
print(hash("123"))
输出结果