提问人:live-today 提问时间:9/8/2023 最后编辑:trincotlive-today 更新时间:11/11/2023 访问量:81
局部变量如何在内存中存储和返回 (Python)?
how the local variable are stored and returned in memory (python)?
问:
我总是使用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 和 #2 会打印不同的地址,但它是一样的。 当函数返回时,Python 中不会发生复制吗?如果发生这种情况,我认为 1 和 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;
}
如果您提出任何材料来深入了解这个问题,我将不胜感激。谢谢!
答:
1赞
Benedict
9/9/2023
#1
在 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
然后,重新指派以引用新的整数对象 ()。当然,of 与 不同。local_var_different_scope
2
id=abc
id
2
1
希望这有帮助!
对象如何在函数调用后持续存在?
简单地说,它之所以存在,是因为返回的对象被分配给了一个变量,而 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 中一个对象的引用。 只需使用 !x
45
id=123
return x
返回了引用的对象,但未返回变量!x
评论
copy.copy()
id()
告诉您值的 ID,而不是变量的 ID。如果要用 C 语言进行类比,则每个变量都是一个指针,并返回指针值,而不是指针的地址。id