>>> 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
>>> 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()
中c
和c[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 如何为各种数据类型分配地址,特别是(此处)字符串。
我在上面解释了这一点,但回顾一下:c
和c[0]
在 C 中不同。在 Python 中,第一个是字符串,第二个是请求包含字符串第一个字符的子字符串。
Python 在许多领域确实使用了 arena 风格的内存管理方案,但在大多数情况下,您不需要关心这一点。如果你很好奇,我建议你看看Python 源代码。该Python
子目录具有许多语言和低级运行时支持位。并且还意识到 Python 也预先缓存了一些东西,这也可以解释您在上面看到的地址差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句