首先,我们应该从Python开始,它的工作方式与C不同。在C中,数组只是一块内存。在Python中,它是一个对象。 c
和c[0]
的id()
与结果不一样。
其次,你应该认识到Python中的每一件事都是一个对象。在C中,当你想做类似c[0]
的事情时,你正在请求一系列内存位置的第一个值。在Python中,情况并非一定如此。对于一个标准列表,它由一个数组支持,但是它的地址对你来说是隐藏的。你看到的是通过id()
对象的地址。在这种情况下,c
是一个字符串,但这样是c[0]
(没有字符类型在Python)。这意味着当您要求c[0]
时,Python正在创建一个新字符串来表示您请求的字符(或者说,子字符串)。幸运的是,Python实际上并没有每次创建一个新的字符串,因为Python会自动实现一个字符的字符串。
另外,记住,Python对象有一个结构和太消耗内存。关于C的最好的事情之一是能够非常控制内存布局,但是你在Python中失去了这方面的能力。翻盖面是,你不必做手工分配和内存,这是一种解脱(我做了很多C和Python编程,让我看到了好处)释放。
三,很多更多的内存分配和释放在Python中发生。根据构建Python的方式以及分配内存的底层操作系统策略,可能会发生任何数量的事情,导致地址不会按顺序增加。但由于一切是一个对象,有一个潜在的分配正在发生的一切。
我有这个疑问,因为我学过C++第一(说实话,用Turbo C++)和字符串的地址都是用Python定义方式是用C会发生什么++非常不同。我想这在Python中是好的,因为我们不能通过它在Python中的地址来访问对象,对吗?
yes和no。当你说c[0]
时,在引擎盖下面正在运行一个特殊的方法来从字符串中检索子字符串。这与你在C++中获得的不同。但是,Python确实将字符串作为字节序列进行有效存储。所以只是因为你看不到效率检查地址,并不意味着它不在那里。另外,正如我上面提到的,c[0]
返回一个新的字符串,表示您想要的子字符串。 Python在这里很聪明,会返回一个1个字符的字符串,但它将是一个内部字符串。你可以看到一些字母具有相同的地址:
>>> for c in "hobo":
... print c, id(c)
...
h 4434994600
o 4434861432
b 4434859712
o 4434861432
你可以看到,"o"
共享相同的地址字符串 - 顺便说一句,这个例子的Python 2,但在Python 3
存在同样的质量
而且你是正确的,你不能访问由它的地址对象 - 至少这是不是语言的一个特征。如何生成ids是一个实现细节,但是你应该指望每个Python解释器都这样做。
另外,为c和c [0]设置不同的地址有什么意义?对于某些人来说,这些问题可能是不必要的,但我很好奇,不知道Python如何为各种数据类型(特别是字符串)分配地址。
我解释这上面,而是概括:c
和c[0]
比在C.在Python不同,首先是字符串和第二请求包含字符串的第一个字符的子字符串。
Python做在许多领域使用的舞台风格的内存管理方案,但在大多数情况下,你不需要关心这个。如果你好奇,我建议你看看Python source code。 Python
子目录具有许多语言和低级运行时支持位。同时也意识到,Python也预先缓存了一些内容,这也可以解释上述地址中的差异。
另外解释downvote,因为这是我在这个网站上的第一个问题。 –