与其说这是一个“如何”的问题,不如说这是一个关于python如何存储变量的问题。你知道吗
据我所知(如果我错了,请纠正我),当在(比如)C中创建变量时,值存储在内存中,而该内存的地址存储在变量名下。在python中,它在内存中创建值,然后用变量名“标记”内存地址。所以如果你这么做:
>>> x = 3
>>> y = x
>>> id(x)
42
>>> id(y)
42
x和y的内存地址相同
如果我这样做:
>>> x = 4
>>> print y
3
应该的。如果我查询地址:
>>> id(x)
46
>>> id(y)
42
看起来python已经为新的x值创建了新的内存,y保持不变。但当我这么做的时候:
>>> y = 4
>>> id(y)
46
python似乎已经在内存中搜索了一个与输入变量匹配的值,然后用名称“y”标记了该内存地址——如果没有找到这样的值,那么它会在内存中创建一个新值,然后标记该值
我的想法对吗?你知道吗
我遇到的问题是,对于我的小“x”和“y”示例来说,这一切都很好,但是对于一个有数百万个变量的程序呢?这是否意味着每当分配一个变量值时,它必须在分配新内存之前搜索整个内存,寻找匹配项?你知道吗
直观地说,虽然这种方法肯定会节省大量的空间,但它可能不会非常节省时间,但是我想,很多人,比我聪明得多,在制作python方面投入了大量的精力和工作,所以显然不是这样。所以我的问题是,在我的理解中,我遗漏了什么使这种方法成为内存管理的好方法?你知道吗
这仅仅是一个问题,在列表中搜索最多是时间复杂度O(n),所以对于快速处理器,这不是一个真正的问题吗?还是有更深层次的东西?你知道吗
不,在C中,变量被创建,并且在声明它的语句执行之前(只要声明是可执行的)在内存中获得一个位置。赋值给那个变量会改变它的内存位置。你知道吗
是的。或者,等价地,变量持有一个指向对象的指针(任何类型)。你知道吗
id
不返回内存地址。它返回一个整数,该整数仅在该对象的生命周期内针对该特定对象返回。你知道吗这种行为是实现定义的,在CPython中,只有整数0-127才会发生。它不会发生在任何其他值的情况下。你也可以“打败”这种实习行为。你知道吗
此外,没有扫描。Interning可能使用数组来存储interned值,因为这些值是整数。你知道吗
这里有对CPython实现的详细描述:
http://www.laurentluce.com/posts/python-integer-objects-implementation/
您看到的行为是因为python处理小整数是一种特殊情况,因为它们非常常见。例如,试试这个,看看不同的结果。你知道吗
首先,你要问的是字面上定义为“
implementation defined
”。你知道吗我的猜测是Python实际上是在编译时进行检查的,根据它所知道的优化内存布局。你知道吗
我几乎可以保证它不会搜索每个变量。首先,它必须知道什么是可变的,什么是不可变的(提示:“what's not”是一个很短的列表)。如果它是可变的,就不能重复使用旧的。你知道吗
相关问题 更多 >
编程相关推荐