鱼C论坛

 找回密码
 立即注册
查看: 1689|回复: 6

[已解决]python中类的内存空间问题

[复制链接]
发表于 2020-7-15 09:44:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class cla:
    def __init__(self):
        pass
    def test(self):
        pass
        # return self.test

a=cla()
print(a.test)  # <bound method cla.test of <__main__.cla object at 0x0000027D13E4CDC8>>
print(id(a.test)) # 2736195719240
print(cla.__dict__)  # 'test': <function cla.test at 0x0000027D13CD1828>

请问为什么a.test和id(a.test)输出的内存地址不一样,感谢
最佳答案
2020-7-15 11:05:45
print(a.test)  # <bound method cla.test of <__main__.cla object at 0x0000027D13E4CDC8>>  #实例化a的地址
print(cla().test)  # <bound method cla.test of <__main__.cla object at 0x000001BB7DCACE88>> #cla()又是一个新的实例化,地址自然不同。

怎样才能更好的了解python的内存地址问题,有什么相关书籍推荐吗,谢谢  #对于python而言,并不能直接操纵地址,显示的地址只是验证是否为同一对象。
例如
>>> class A:
        pass

>>> a1 = A()
>>> print(a1)
<__main__.A object at 0x00000171700E8580>
>>> a2 = a1
>>> print(a2)
<__main__.A object at 0x00000171700E8580>
我的体会,不必特意去研究地址问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-15 09:49:30 | 显示全部楼层
print(a.test)  # <bound method cla.test of <__main__.cla object at 0x0000027D13E4CDC8>>    # 显示cla的地址
print(id(a.test)) # 2736195719240      #显示实例化a的test地址
print(cla.__dict__)  # 'test': <function cla.test at 0x0000027D13CD1828>     #显示类cla的test地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-15 10:28:19 | 显示全部楼层
冬雪雪冬 发表于 2020-7-15 09:49
print(a.test)  #     # 显示cla的地址
print(id(a.test)) # 2736195719240      #显示实例化a的test地址
...

再请教一下,请问下面两个的区别是什么
print(a.test)  # <bound method cla.test of <__main__.cla object at 0x0000027D13E4CDC8>>
print(cla().test)  # <bound method cla.test of <__main__.cla object at 0x000001BB7DCACE88>>
怎样才能更好的了解python的内存地址问题,有什么相关书籍推荐吗,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 11:01:44 | 显示全部楼层
[b]
proer 发表于 2020-7-15 10:28
再请教一下,请问下面两个的区别是什么

怎样才能更好的了解python的内存地址问题,有什么相关书籍推荐 ...

01.print(a.test)  # <bound method cla.test of <__main__.cla object at 0x0000027D13E4CDC8>>
表示的是实例化对象 a 中的内存地址
02.print(cla().test)  # <bound method cla.test of <__main__.cla object at 0x000001BB7DCACE88>>
表示的是 cla() 重新再一次实例化后的内存地址

第一个是cla() 实例化一次后赋值给了 a , 而第二个是再次实例化 所以两次的内存地址不同

书籍不清楚,但是你可以看看这些文章,有助于你的了解:

了解Python中的内存分配和管理

Python id() 函数



                               
登录/注册后可看大图



如果帮到你了,设置下最佳可好呀
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-15 11:05:45 | 显示全部楼层    本楼为最佳答案   
print(a.test)  # <bound method cla.test of <__main__.cla object at 0x0000027D13E4CDC8>>  #实例化a的地址
print(cla().test)  # <bound method cla.test of <__main__.cla object at 0x000001BB7DCACE88>> #cla()又是一个新的实例化,地址自然不同。

怎样才能更好的了解python的内存地址问题,有什么相关书籍推荐吗,谢谢  #对于python而言,并不能直接操纵地址,显示的地址只是验证是否为同一对象。
例如
>>> class A:
        pass

>>> a1 = A()
>>> print(a1)
<__main__.A object at 0x00000171700E8580>
>>> a2 = a1
>>> print(a2)
<__main__.A object at 0x00000171700E8580>
我的体会,不必特意去研究地址问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 14:18:20 | 显示全部楼层
冬雪雪冬 发表于 2020-7-15 11:05
print(a.test)  #   #实例化a的地址
print(cla().test)  #  #cla()又是一个新的实例化,地址自然不同。

...

感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 14:18:58 | 显示全部楼层
Hello. 发表于 2020-7-15 11:01
表示的是实例化对象 a 中的内存地址

表示的是 cla() 重新再一次实例化后的内存地址

感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 23:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表