为什么不同数据类型的地址不同[Python]?

里沙巴·兰詹
>>> a=5
>>> b=6
>>> id(a)
10914496
>>> id(b)
10914528
>>> c='Hello'
>>> d='World'
>>> id(c)
139973573252184
>>> id(d)
139973616356744
>>> e=(4>5)
>>> f=(4<5)
>>> id(e)
10739968
>>> id(f)
10740000
  1. 为什么 string 和 boolean/int 数据类型的地址长度如此不同?
  2. 与数据类型的大小相比,为什么后续声明的地址有相当大的差异?

更新#1

>>> id(c)
139973616356856
>>> id(c[0])
139973652926112
>>> id(c[1])
139973653190728
>>> id(c[2])
139973653634272
>>> id(c[3])
139973653302104

我有这个疑问,因为我首先学习了 C++(老实说,Turbo C++)并且在 Python 中定义字符串地址的方式与在 C++ 中发生的情况非常不同。我想这在 Python 中没问题,因为我们无法通过 Python 中的地址访问对象,对吗?

另外,为 c 和 c[0] 设置不同的地址有什么意义?这些问题对某些人来说可能是不必要的,但我很想知道 Python 如何为各种数据类型分配地址,特别是(此处)字符串。

约翰·萨克迈斯特

首先,我们应该从 Python 的工作方式与 C 不同开始。在 C 中,数组只是一块内存。在 Python 中,它是一个对象。id()cc[0]是不一样的,一个结果。

其次,你应该意识到 Python 中的每一件事都是一个对象。在 C 中,当您执行诸如 之类的操作时c[0],您是从一系列内存位置请求第一个值。在 Python 中,情况不一定如此。对于标准列表,它由一个数组支持,但它的地址对您隐藏。您看到的是通过id(). 在这种情况下,c是一个字符串,但也是c[0](Python 中没有字符类型)。这意味着当您请求 时c[0],Python 正在创建一个新字符串来表示您请求的字符(或者更确切地说,子字符串)。幸运的是,Python 实际上不会每次都创建一个新字符串,因为 Python 会自动插入 1 个字符的字符串。

另外,请记住,Python 对象有一个结构,它也会消耗内存。关于 C 的最好的事情之一是能够在很大程度上控制内存布局,但在 Python 中你失去了这方面的能力。另一方面是您不必手动分配和释放内存,这是一种解脱(我做了很多 C 和 Python 编程,所以我看到了好处)。

第三,有很多更多的内存分配和Python中释放发生。根据 Python 的构建方式以及分配内存的底层操作系统策略,可能会发生任何数量的事情导致地址不按顺序增加。但是,由于一切都是对象,因此所有事物都有潜在的分配。

我有这个疑问,因为我首先学习了 C++(老实说,Turbo C++)并且在 Python 中定义字符串地址的方式与在 C++ 中发生的情况非常不同。我想这在 Python 中没问题,因为我们无法通过 Python 中的地址访问对象,对吗?

是的,也不是。当您说 时c[0],正在运行一个特殊的方法来从字符串中检索子字符串。这与您在 C++ 中得到的不同。然而,Python 确实有效地将字符串作为字节序列存储在引擎盖下。因此,仅仅因为您看不到检查地址的效率,并不意味着它不存在。此外,正如我上面提到的,c[0]返回一个新字符串,代表您想要的子字符串。Python 在这里很聪明,它将返回一个 1 个字符的字符串,但它将是一个实习字符串。您可以看到一些字母具有相同的地址:

>>> for c in "hobo":
...     print c, id(c)
...
h 4434994600
o 4434861432
b 4434859712
o 4434861432

可以看到 for 的字符串"o"共享同一个地址——顺便说一句,示例是 Python 2,但在 Python 3 中存在相同的质量。

你是对的,你不能通过它的地址访问对象——至少这不是语言的一个特性。如何生成 id 是一个实现细节,但您应该指望每个 Python 解释器都这样做。

另外,为 c 和 c[0] 设置不同的地址有什么意义?这些问题对某些人来说可能是不必要的,但我很想知道 Python 如何为各种数据类型分配地址,特别是(此处)字符串。

我在上面解释了这一点,但回顾一下:cc[0]在 C 中不同。在 Python 中,第一个是字符串,第二个是请求包含字符串第一个字符的子字符串。

Python 在许多领域确实使用了 arena 风格的内存管理方案,但在大多数情况下,您不需要关心这一点。如果你很好奇,我建议你看看Python 源代码Python子目录具有许多语言和低级运行时支持位。并且还意识到 Python 也预先缓存了一些东西,这也可以解释您在上面看到的地址差异。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么C ++中不同数据类型的大小不同

来自分类Dev

为什么 Numpy 的 int 数据类型与 Numpy 的 int64 数据类型的类型不同?

来自分类Dev

为什么地址不同但仍指向相同的数据?

来自分类Dev

为什么不同的数据类型会为相同的数据占用更多的内存?

来自分类Java

为什么Java具有与C不同的固定数据类型大小

来自分类Dev

为什么余数运算符会因不同的数据类型而失败?

来自分类Dev

为什么'gl_Position'和'position'是不同的数据类型

来自分类Mysql

为什么SQL UNION可以合并MySQL中具有不同数据类型的两列?

来自分类Dev

为什么.dtproj和.dtsx文件之间的数据类型设置不同?

来自分类Dev

在Scala中,为什么不能用不同的数据类型更改var变量的值

来自分类Dev

为什么wash_out不能在不同的soap操作中使用相同的数据类型?

来自分类Dev

连接不同的数据类型

来自分类Dev

genfromtxt不同的数据类型

来自分类Dev

对不同数据类型的操作

来自分类Dev

为什么$和[在数据框列上给出不同的输出表示形式和数据类型?

来自分类Dev

为什么我收到一个错误,即使在转换字段数据类型后我也无法连接两种不同的数据类型

来自分类Dev

使用python读取多行不同数据类型

来自分类Dev

python中不同数据类型的排序是如何发生的

来自分类Dev

Python-根据input()数据类型执行不同的任务

来自分类Dev

从python中的函数返回不同的数据类型

来自分类Dev

glReadPixels 在 Python 中返回不同的数据类型

来自分类Dev

将值直接传递给sizeof运算符时,为什么数据类型的大小不同?

来自分类Dev

为什么 unsigned char 具有与其他数据类型不同的默认初始化行为?

来自分类Dev

具有不同数据类型的容器:2 种方法,只编译一种。为什么?

来自分类Dev

地址是什么数据类型?

来自分类Dev

MySQL返回的数据类型和python为不同的功能输出不同的类型

来自分类Dev

为什么此Python类具有不同的地址?

来自分类Java

如何使用MapStruct不同的数据类型?

来自分类Dev

Linq具有不同的数据类型

Related 相关文章

  1. 1

    为什么C ++中不同数据类型的大小不同

  2. 2

    为什么 Numpy 的 int 数据类型与 Numpy 的 int64 数据类型的类型不同?

  3. 3

    为什么地址不同但仍指向相同的数据?

  4. 4

    为什么不同的数据类型会为相同的数据占用更多的内存?

  5. 5

    为什么Java具有与C不同的固定数据类型大小

  6. 6

    为什么余数运算符会因不同的数据类型而失败?

  7. 7

    为什么'gl_Position'和'position'是不同的数据类型

  8. 8

    为什么SQL UNION可以合并MySQL中具有不同数据类型的两列?

  9. 9

    为什么.dtproj和.dtsx文件之间的数据类型设置不同?

  10. 10

    在Scala中,为什么不能用不同的数据类型更改var变量的值

  11. 11

    为什么wash_out不能在不同的soap操作中使用相同的数据类型?

  12. 12

    连接不同的数据类型

  13. 13

    genfromtxt不同的数据类型

  14. 14

    对不同数据类型的操作

  15. 15

    为什么$和[在数据框列上给出不同的输出表示形式和数据类型?

  16. 16

    为什么我收到一个错误,即使在转换字段数据类型后我也无法连接两种不同的数据类型

  17. 17

    使用python读取多行不同数据类型

  18. 18

    python中不同数据类型的排序是如何发生的

  19. 19

    Python-根据input()数据类型执行不同的任务

  20. 20

    从python中的函数返回不同的数据类型

  21. 21

    glReadPixels 在 Python 中返回不同的数据类型

  22. 22

    将值直接传递给sizeof运算符时,为什么数据类型的大小不同?

  23. 23

    为什么 unsigned char 具有与其他数据类型不同的默认初始化行为?

  24. 24

    具有不同数据类型的容器:2 种方法,只编译一种。为什么?

  25. 25

    地址是什么数据类型?

  26. 26

    MySQL返回的数据类型和python为不同的功能输出不同的类型

  27. 27

    为什么此Python类具有不同的地址?

  28. 28

    如何使用MapStruct不同的数据类型?

  29. 29

    Linq具有不同的数据类型

热门标签

归档