Python(青铜时代)——变量的引用与可变

引用

概念

  • 变量  数据 都是保存在内存中的

  • 在 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"))

输出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值