Skip to content

Latest commit

 

History

History
300 lines (213 loc) · 5.35 KB

File metadata and controls

300 lines (213 loc) · 5.35 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0047
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在: 

     个人网站: `https://oeasy.org` 
     蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
     GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
     Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

变量在内存内的什么位置_物理地址_id_内存地址_物理地址

回忆上次内容

  • 配套视频
  • 声明、赋值之
    • 能使用变量
  • 声明、赋值了之
    • 能使用变量

图片描述

  • 顺序 必须 清清楚楚
  • 那 声明的 这俩变量
    • 具体存在哪儿呢? 🤔

问问ai

图片描述

  • 收获 新函数 id

id

图片描述

  • id 就是
    • identity
    • 唯一的身份标识号
    • 身份证号

图片描述

  • id函数怎么用呢?

id

q #退出 pdb环境
  • 从pdb退回到vim
    • 进入游乐场
s1 = "oeasy"
id(s1)
  • 结果
    • s1的id是一长串数字
    • 数值 和 截图不一样 很正常
    • 只要是 一串数字 就对了

图片描述

  • 这串数字 什么含义?🤔

问问ai

图片描述

  • 这串数字 是
    • 内存地址的 整数值
  • 什么是内存?🤔

内存

  • 内存
    • 随机存储器
    • Random Access Memory
    • RAM

图片描述

  • py程序 运行在 内存中
    • 其中变量 也存储在 内存中
    • 每次运行的状态不同
    • 分配的位置也不同

图片描述

  • 内存里面有很多字节
    • 就像 楼房里面的小房间

内存地址

  • 变量就存储在小房间中
    • 内存地址 就是 小房间的门牌号码

图片描述

  • 回游乐场 去问问 python本人
    • id函数 是什么意思?🤔

唯一标识

help(id)
  • id返回 的是
    • 对象 的 唯一标记
    • the identity of an object

图片描述

  • 对于
    • 不断变化 的 对象
    • 每个 对象 都有
    • 唯一标记
    • idnetity
  • 两个变量
    • id会相同吗?

测试

  • 退回游乐场
s1 = "oeasy"
s2 = "o2z"
print(id(s1))
print(id(s2))
  • 两个变量s1、s2
    • 确实id不同

图片描述

  • 具体数值 不一样 没事的
    • 运行时 内存现状 不一样
    • 就会导致 分配地址不一致
  • 如果 两个变量s1、s2
    • 存的都是 "oeasy" 呢?

相同对象

s1 = "oeasy"
s2 = "oeasy"
print(id(s1))
print(id(s2))
print(id(s1) == id(s2) )
  • 结果

图片描述

  • s1、s2
    • 存的内容相同
      • 都是 "oeasy"
    • id 居然 相同 ?!!! 😦
  • id 不是 变量唯一身份证 吗?
    • 两个 不同的变量 id相同
    • 怎么理解?🤔

再查询手册

  • 对象的id
    • 唯一标识地址
    • 确实 是要确保 唯一
    • unique

图片描述

  • simultaneously

    • [ˌsɪməlˈteɪniəsli]
    • 同时地
  • 同时存在的各个对象

    • 都得确保
    • 有唯一的标识
  • 到底什么是唯一的?

多次引用

  • 存'oeasy' 的
    • 这块内存地址
    • 唯一
  • 这块地址
    • 两个变量 所引用
      • s1
      • s2
    • 两个变量都引用 这个房间号

图片描述

  • 但是 如果
    • 又 给s1 再赋个
    • 那么 s1
      • 会 引用 的地址 吗?🤔

实践

s1 = "oeasy"
s2 = "oeasy"
print(id(s1))
print(id(s2))
print(id(s1) == id(s2) )
s2 = "o2z"
print(id(s1))
print(id(s2))
print(id(s1) == id(s2) )
  • s2 最初 引用的是
    • 存"oeasy"的地址

图片描述

新id

  • 现在 s2 要存"o2z"
    • 得换 地址

图片描述

  • 如果s1所存储的字符串
    • 也变了呢?

也变了

s1 = "oeasy"
s2 = "oeasy"
print(id(s1))
print(id(s2))
print(id(s1) == id(s2) )
s1 = "ooo"
s2 = "o2z"
print(id(s1))
print(id(s2))
print(id(s1) == id(s2) )

图片描述

  • 原来存"oeasy" 那片地址
    • 怎么办呢?

自动垃圾回收

  • 系统 发现
    • 这块 存着 "oeasy"字符串 的地址、
    • 没有对象 再引用
    • 就垃圾回收了

图片描述

  • 其他语言
    • 一般还需要 手动垃圾回收
    • python 直接就给 自动回收了

总结

  • 这次我们 了解了 id 函数
    • id函数 可以得到
    • 变量对象 所引用的 唯一内存地址
s1 = "oeasy"
A = 10
  • 现在都是
    • 用 字面量(literal)
    • 给变量 赋值

图片描述

  • 可以
    • 变量
    • 给变量 赋值 吗? 🤔
  • 我们下次再说!👋
  • 配套视频

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。