这是什么意思<_io.BytesIO对象位于0x000002244592F1A8>?

时间:2018-08-03 17:46:59

标签: python

我有一个网址:

https://enterpriseefiling.fcc.gov/dataentry/api/download/dbfile/Current_LMS_Dump.zip

u1 = ['https://enterpriseefiling.fcc.gov/dataentry/api/download/dbfile/Current_LMS_Dump.zip']

我在python解释器中运行以下代码

import requests, io
r = requests.get(u1, stream=True)
io.BytesIO(r.content)

我收到以下答复

<_io.BytesIO object at 0x000002244592F1A8>

我的问题是:这是什么意思? 0x000002244592F1A8在哪里? 0x000002244592F1A8指的是什么?

3 个答案:

答案 0 :(得分:0)

当python需要打印出一个对象,并且该对象没有内置的方法来告诉解释器如何打印它时(例如,requests.Response和python的内置listdict类型 do 具有这种说明),python使用以下格式:

<[objecttype] object at [pointer]>

其中pointer实际上是指向对象在内存中位置的指针。那就是您在这里看到的:在解释器中执行io.BytesIO(r.content)时,您将创建一个io.BytesIO对象。

在解释器上执行操作时,往往会调用另一种方法

>>> print(<object>)

不只是

>>> <object>

io.BytesIO类当然具有可以用于更有用的输出的方法(如果查看其文档)。尝试将其分配给变量,而不是打印它:

b = io.BytesIO(r.content)

答案 1 :(得分:0)

我的理解是,0x000002244592F1A8是内存中对象的格式id。我说“格式化”是因为,如果您在同一对象上执行id(),表示形式将有所不同(它将被格式化为intlong而不是指针地址:

In [1]: import io

In [2]: obj = io.BytesIO()

In [3]: obj
Out[3]: <_io.BytesIO at 0x10da1ca70>

In [4]: id(obj)
Out[4]: 4523674224

要将id()转换为您看到的格式,您可以执行以下操作(从this post窃取):

In [5]: format(id(obj), '#010x' if sys.maxsize.bit_length() <= 32 else '#18x')
Out[5]: '       0x10da1ca70'

此^^并不是特别有用,但它仅向您显示id()与您所看到的内容如何对齐。

看到它的原因仅仅是它显示为__repr__()对象的默认BytesIO的一部分。

答案 2 :(得分:0)

  

0x000002244592F1A8指的是什么?

它是指对象的 identity 。该数字是一个实现细节(在CPython中,它恰好是对象在内存中的地址,与id内置函数返回的数字相同),但是您可以指望的是,每个数字都会有所不同BytesIO个对象当前在该过程中存在。

这类信息包含在许多对象的__repr__中,因为它在调试时会很有用,可以区分可能具有相同内容的不同对象。