python如何执行变量赋值?

2024-04-25 07:46:43 发布

您现在位置:Python中文网/ 问答频道 /正文

与其说这是一个“如何”的问题,不如说这是一个关于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),所以对于快速处理器,这不是一个真正的问题吗?还是有更深层次的东西?你知道吗


Tags: 方法内存标记程序名称id示例地址
3条回答

variable is created in (say) C, the value is stored in memory and the address of that memory is stored under the variable name

不,在C中,变量被创建,并且在声明它的语句执行之前(只要声明是可执行的)在内存中获得一个位置。赋值给那个变量会改变它的内存位置。你知道吗

In python it creates the value in memory, and then "tags" that memory address with the variable name.

是的。或者,等价地,变量持有一个指向对象的指针(任何类型)。你知道吗

id

id不返回内存地址。它返回一个整数,该整数仅在该对象的生命周期内针对该特定对象返回。你知道吗

seems that python has searched through the memory looking for a value that matches the input variable

这种行为是实现定义的,在CPython中,只有整数0-127才会发生。它不会发生在任何其他值的情况下。你也可以“打败”这种实习行为。你知道吗

此外,没有扫描。Interning可能使用数组来存储interned值,因为这些值是整数。你知道吗

这里有对CPython实现的详细描述:

http://www.laurentluce.com/posts/python-integer-objects-implementation/

您看到的行为是因为python处理小整数是一种特殊情况,因为它们非常常见。例如,试试这个,看看不同的结果。你知道吗

>>> x = 88888888888888888888888
>>> y = 88888888888888888888888
>>> id(x)
4321062304
>>> id(y)
4321062344

首先,你要问的是字面上定义为“implementation defined”。你知道吗

我的猜测是Python实际上是在编译时进行检查的,根据它所知道的优化内存布局。你知道吗

我几乎可以保证它不会搜索每个变量。首先,它必须知道什么是可变的,什么是不可变的(提示:“what's not”是一个很短的列表)。如果它是可变的,就不能重复使用旧的。你知道吗

相关问题 更多 >