关于python中"对象的引用"的问题

h_heo 2018-05-03 09:55:58

class Test(object):
pass

b = Test()

print(id(b))

上面的b是一个引用,指向了一个Test对象,用id()可以知道对象的内存地址,那么这个b对象引用在内存有没有地址存着它呢,有的话,怎么样可以知道它的地址? 还是怎么样理解这个引用才正确,这个引用在内存中是一个怎么样的东西?
...全文
471 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
混沌鳄鱼 2018-05-03
  • 打赏
  • 举报
回复

Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class Test: pass

>>> b = Test()
>>> id(b)
1869634166736
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'Test': <class '__main__.Test'>, 'b': <__main__.Test object at 0x000001B34EE15FD0>}
>>> hex(1869634166736)
'0x1b34ee15fd0'
>>> 
变量 b 不是一个对象了, 只是一个字符串标签绑上了对象地址,存放在globals 这个字典里。
oyljerry 2018-05-03
  • 打赏
  • 举报
回复
有一个实际的物理地址,但是python是高级语言,它一般不会直接访问这个实际的地址,所有有一个id来做为标识,python虚拟机通过它来映射到最终的物理地址。所以b可以理解为一个引用
陈年椰子 2018-05-03
  • 打赏
  • 举报
回复
建议找本计算机原理的书看看。 按图书馆的图书卡理解。 可以理解成 b 是一本书。存在12号书架,03层,顺序号45 , b 的地址是120345 图书卡上写着 a 012399 b 120345 你要想看b这本书, 必须要通过 120345 这个地址去找, 也可以理解为 就是一个引用。
h_heo 2018-05-03
  • 打赏
  • 举报
回复
引用 3 楼 xpresslink 的回复:

Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class Test: pass

>>> b = Test()
>>> id(b)
1869634166736
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'Test': <class '__main__.Test'>, 'b': <__main__.Test object at 0x000001B34EE15FD0>}
>>> hex(1869634166736)
'0x1b34ee15fd0'
>>> 
变量 b 不是一个对象了, 只是一个字符串标签绑上了对象地址,存放在globals 这个字典里。
我还想请教你一个问题, 有没有方法知道,存着局部变量里的一个这样的字典
h_heo 2018-05-03
  • 打赏
  • 举报
回复
引用 3 楼 xpresslink 的回复:

Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class Test: pass

>>> b = Test()
>>> id(b)
1869634166736
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'Test': <class '__main__.Test'>, 'b': <__main__.Test object at 0x000001B34EE15FD0>}
>>> hex(1869634166736)
'0x1b34ee15fd0'
>>> 
变量 b 不是一个对象了, 只是一个字符串标签绑上了对象地址,存放在globals 这个字典里。
谢谢你的回复 你这个回复 好像我明白点了什么 谢谢
h_heo 2018-05-03
  • 打赏
  • 举报
回复
引用 1 楼 seakingx 的回复:
建议找本计算机原理的书看看。 按图书馆的图书卡理解。 可以理解成 b 是一本书。存在12号书架,03层,顺序号45 , b 的地址是120345 图书卡上写着 a 012399 b 120345 你要想看b这本书, 必须要通过 120345 这个地址去找, 也可以理解为 就是一个引用。
谢谢你的回复,我还是不理解b在内存是怎么存在的,这样比喻:书卡是内存条, 现实中,b的书名和书对应位置写在书卡(内存上),那么在内存上的书名和对应的位置也要一个地址来存放它?
  • 打赏
  • 举报
回复
就像是贴了标签一样,b就是一个指向test()的标签,就像指针一样,还有git里的分支

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧