V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
foxyier
V2EX  ›  Python

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

  •  
  •   foxyier · 209 天前 · 588 次点击
    这是一个创建于 209 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题描述: 循环执行以下两个操作: 「 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. 想请教一下为什么采用第一种方式的时候,实例的内存地址在两个内存地址中来回跳动
    luoleng
        1
    luoleng   209 天前
    示例 1 中,先是创建一个 Class1 实例( m ),然后把它赋予变量 c,新一轮 for 循环的时候,又重新创建一个 Class1 实例( n ),然后又把它赋予变量 c,这个时候因为实例 m 没有被引用了,所以会被销毁。之后的循坏又是在 m 的原地址上创建 m1,然后销毁 n……
    示例 2 中,函数执行完后在函数体内创建的变量就被销毁了;之后的实例也是在原来实例的地址上创建的;
    至于新实例为什么会在已被销毁的旧实例地址上创建,我姑且认为是 python 自己内存优化的一种结果吧。
    gwy15
        2
    gwy15   209 天前
    楼上说得对,要到第二次 c = Class1() 的时候才会失去上一个迭代的引用,然后才会进行 GC 。

    如果改成

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

    就会变成一样的地址了
    foxyier
        3
    foxyier   209 天前
    @luoleng @gwy15 理解了, 多谢
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2141 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 16ms · UTC 09:58 · PVG 17:58 · LAX 02:58 · JFK 05:58
    ♥ Do have faith in what you're doing.