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

问题描述 投票:0回答:1

我总是使用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 memory memory-management stack heap
1个回答
0
投票

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

因此,在此代码片段中,您创建了一个

1
(
id=xyz
) 对象并将该对象 (
id=xyz
) 返回给
local_var_different_scope
。因此
local_var_different_scope
现在引用
id=xyz
对象(这是您创建的整数
1
)。

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

然后,您将

local_var_different_scope
重新分配给 reference 一个新的整数对象
2
(
id=abc
)。当然,
id
2
1
不同。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.