局部变量如何在内存中存储和返回 (Python)?

how the local variable are stored and returned in memory (python)?

提问人:live-today 提问时间:9/8/2023 最后编辑:trincotlive-today 更新时间:11/11/2023 访问量:81

问:

我总是使用python而不考虑它的内存管理。但是,我有一个关于它如何处理内存的大问题。

def func1():
    local_var = 1
    print(id(local_var))  # memory address of local_var (stored in stack variable) -> 1
    return local_var


# value copied, and local_var_different_scope points another memory address
local_var_different_scope = func1() 
print(id(local_var_different_scope))  # -> 2
local_var_different_scope = 2
print(id(local_var_different_scope)) # -> 3
  1. 我预计 #1 和 #2 会打印不同的地址,但它是一样的。 当函数返回时,Python 中不会发生复制吗?如果发生这种情况,我认为 1 和 2 需要指向不同的地址,因为它位于不同的函数中。
  2. 另外,我想知道 2 和 3 是不同的。我认为如果我更改该值,则内存中的值会更改,但地址保持不变。 例如,下面的 C 代码显示了相同的地址。
#include <stdio.h>

int main() {
    int a = 1;
    printf("%p\n", &a);
    
    a = 2;
    printf("%p\n", &a); // same as above!

    return 0;
}

如果您提出任何材料来深入了解这个问题,我将不胜感激。谢谢!

python 内存 内存管理 堆栈内存

评论

0赞 Anentropic 9/8/2023
这是否有助于: stackoverflow.com/a/28228502/202168 “在 Python 中,变量名称可以被认为是对值的绑定”
1赞 Barmar 9/8/2023
Python 从不复制任何内容,除非您显式调用类似 .所有数据都作为引用传递。copy.copy()
0赞 Barmar 9/8/2023
id()告诉您值的 ID,而不是变量的 ID。如果要用 C 语言进行类比,则每个变量都是一个指针,并返回指针值,而不是指针的地址。id

答:

1赞 Benedict 9/9/2023 #1

在 Python 中,所有赋值都是对对象的引用 - 在您的例子中是整数对象(在 Python 中,一切都是对象!

因此,在此代码段中,您创建了一个 () 对象并将该对象 () 返回给 。因此,现在引用对象(即您创建的整数)。1id=xyzid=xyzlocal_var_different_scopelocal_var_different_scopeid=xyz1

def func1():
    local_var = 1
    print(id(local_var))  # memory address of local_var (stored in stack variable) -> 1
    return local_var

然后,重新指派以引用新的整数对象 ()。当然,of 与 不同。local_var_different_scope2id=abcid21

希望这有帮助!


对象如何在函数调用后持续存在?

简单地说,它之所以存在,是因为返回的对象被分配给了一个变量,而 Python 足够聪明,知道这一点!

这是另一个有趣的实验:

def return_x():
    x = 45
    print(id(x)) # id=123
    return x
fake_x = return_x()
print(id(fake_x)) # id=123
print(x) # NameError 'x' is not defined

然后有人可能会猜测,既然返回了,它就可以被引用 - 但事实并非如此!x

为了说明这一点,每个赋值都是对 Python 中一个对象的引用。 只需使用 !x45id=123

return x返回了引用的对象,但未返回变量!x