在python for循环中更改浮点值

在python for循环中更改浮点值,python,immutability,Python,Immutability,在经历了一些Python脚本编写之后,Python类型仍然令人惊讶! 在以下循环中: import random very_large_number = 10000000 for i in xrange(very_large_number): variable = random.random() print id(variable) 看起来我正在创建10000000个变量! 有没有办法在内存中只保留一个变量,而只更改其值?每次创建新变量(例如variable=random.ra

在经历了一些Python脚本编写之后,Python类型仍然令人惊讶! 在以下循环中:

import random
very_large_number = 10000000
for i in xrange(very_large_number):
    variable = random.random()
    print id(variable)
看起来我正在创建10000000个变量!
有没有办法在内存中只保留一个变量,而只更改其值?

每次创建新变量(例如
variable=random.random()
)时,它都会被分配到内存中的一个新位置。因为您正在通过循环重新分配这个变量,所以旧变量超出范围,最终会被垃圾收集掉。您只是打印每个新分配的内存位置。这并不意味着打印的每个内存位置都仍然处于活动状态。

变量不保留在内存中。Python进行引用计数-因此在我的机器上,我只得到了输出:

...
29337248
29337272
29337248
29337272
...
看到模式了吗?解释器重新使用内存


至于不变性,这实际上是一个特性。只要有东西引用了这个数字,它就不会消失。如果您指定了一个引用,所有其他引用仍然指向原始值。

我只是试图模拟您的问题:-

>>> import random
>>> very_large_number = 10
>>> for i in xrange(very_large_number):
    variable = random.random()
    print id(variable)


37663064
31924560
37663064
31924560
37663064
31924560
37663064
31924560
37663064
31924560

正如预期的那样,内存被清理和回收。Python垃圾收集器检查引用计数,若并没有引用,那个么对象将从内存中删除

确保使用
xrange
而不是
range
<代码>范围创建数字0的列表。。非常大的数字,这实际上消耗了你的内存。@miraclixx
range
如果OP使用python3就可以了。x@miraculixx谢谢,我编辑了这个,因为数字是不可变的类型,没有办法保留id(和内存)并重新分配另一个值。请看:@Niemerds谢谢,是否有一个可变对象等价于
float
?很好,回答了我问题的第一部分!我还想明确地知道是否/如何可以将值更改为变量。对于不可变类型,这是不可能的,如果您使用任何可变类型(如list),那么您可以实现您想要的。