2016-02-08 23 views
2

之前的问题,这里是示例代码。 请先看看那些人。有关浮点数的python参考

>>> id(1) 
1636939440 
>>> a = 1 
>>> b = 1 
>>> c = 1 
>>> id(a) 
1636939440 
>>> id(b) 
1636939440 
>>> id(c) 
1636939440 


>>> id("hello") 
43566560 
>>> a = "hello" 
>>> b = "hello" 
>>> c = "hello" 
>>> id(a) 
43566560 
>>> id(b) 
43566560 
>>> id(c) 
43566560 



>>> id(3.14) 
34312864 
>>> a = 3.14 
>>> b = 3.14 
>>> c = 3.14 
>>> id(a) 
34312864 
>>> id(b) 
34312600 
>>> id(c) 
34312432 

正如你看到的上面,在整数和字符串而言,Python变量引用 对象以相同的方式。但浮点数以不同的方式工作。 这是为什么?这有什么特别的理由吗?

+0

您只会看到小行星和字符串的行为(由于字符串实习)。 – Selcuk

回答

1

对于小整数和字符串Python使用内部内存优化。由于Python中的任何变量都是对内存对象的引用,因此Python只将这些小值存入内存中一次。然后,无论何时将相同的值分配给任何其他变量,它都会将该变量指向已保存在内存中的对象。这适用于字符串和整数,因为它们是不可变的,并且如果变量值更改,实际上它是此变量所使用的引用已更改,则具有原始值的内存中的对象本身不受影响。

首先,浮点数不是“小”,其次,在内存中取决于计算的相同3.14可能保留为3.14123123456789和3.14123987654321(只是示例数字来解释)。所以这两个值是两个不同的对象,但在计算和显示时,有意义的部分看起来是相同的,即3.14(实际上,对于相同的浮点数,内存中显然有更多可能的值)。这就是为什么在内存中重复使用相同的浮点数对象是有问题的,毕竟不值得。

查看更多浮点数字是如何保存在内存中的位置:

http://floating-point-gui.de/

http://docs.python.org/2/tutorial/floatingpoint.html

此外,还有对甲骨文的文档浮点数大文章。

0

可变且不可变。

字符串,元组和字节是不可变的,而列表和字节数组是可变的。阅读更多关于这里的概念:Data models in Python