跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一个关于 Python 实例化内存地址的基础问题
未分類
25 11 月 2020

请教一个关于 Python 实例化内存地址的基础问题

请教一个关于 Python 实例化内存地址的基础问题

資深大佬 : foxyier 0

问题描述: 循环执行以下两个操作: 「 1. 初始化一个实例,2. 输出实例的内存地址」, 发现每次输出的内存地址在两个内存地址中来回跳动, 但是把这两个操作放入函数中调用, 每次输出的内存地址就相同了, 不太懂具体原理, 目前猜测是语言解释的过程中做了缓存? 如果是这样的话, 单例模式的应用场景感觉是不是就很少了?

示例 1:
for i in range(5):
c = Class1()
print id(c)

示例输出:

4467795088
4467795152
4467795088
4467795152
4467795088

示例 2:

def run():
c = Class1()
print id(c)

for i in range(5):
run()

示例输出:

4566115472
4566115472
4566115472
4566115472
4566115472

1. 想请教一下为什么这两个操作在函数中运行时,输出的实例内存地址相同.
2. 想请教一下为什么采用第一种方式的时候,实例的内存地址在两个内存地址中来回跳动

大佬有話說 (3)

  • 資深大佬 : luoleng

    示例 1 中,先是创建一个 Class1 实例( m ),然后把它赋予变量 c,新一轮 for 循环的时候,又重新创建一个 Class1 实例( n ),然后又把它赋予变量 c,这个时候因为实例 m 没有被引用了,所以会被销毁。之后的循坏又是在 m 的原地址上创建 m1,然后销毁 n……
    示例 2 中,函数执行完后在函数体内创建的变量就被销毁了;之后的实例也是在原来实例的地址上创建的;
    至于新实例为什么会在已被销毁的旧实例地址上创建,我姑且认为是 python 自己内存优化的一种结果吧。

  • 資深大佬 : gwy15

    上说得对,要到第二次 c = Class1() 的时候才会失去上一个迭代的引用,然后才会进行 GC 。

    如果改成

    for i in range(5):
    ….c = Class1()
    ….print(f’0x{id(c):x}’)
    ….del c

    就会变成一样的地址了

  • 主 資深大佬 : foxyier

    @luoleng @gwy15 理解了, 多谢

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具