Python函数内存管理疑问:无返回值函数返回对象为何一致?
问题解答:为何无返回值函数赋值的变量a和b相等?
测试代码
import sys import gc def func_a(a,b,c): print(a,b,c) def func_b(): print("b") a = func_b() b = func_a(1,2,3) print(id(a) == id(b)) print(a is b) class c_1(): def __init__ -> None: pass class c_2(): def __init__ -> None: pass c1 = c_1() c2 = c_2() print(id(c1) == id(c2)) print(c1 is c2)
运行输出
b 1 2 3 True True False False
问题
为何变量a和b相等?当我给函数添加return 1或其他非None返回值时,a和b就不相等了,望解答。
解答
- Python中,没有显式
return语句的函数,默认返回None。所以a = func_b()和b = func_a(1,2,3)本质是把同一个None对象赋值给了a和b。 - Python对
None实现了单例机制:整个程序运行期间只会存在一个None实例。因此用is判断对象身份时会返回True,调用id()获取的内存地址自然也完全相同。 - 当给函数添加
return 1这类非None的返回值时,每次函数调用都会生成新的返回对象(即使返回值数值相同,也不会像None那样共享单例),此时a和b指向的是不同对象,is判断返回False,id()结果也不相等。
另外补充说明代码中类实例的部分:c1和c2是两个不同类的实例,哪怕类结构一致,每次实例化都会创建全新的对象,因此它们的内存地址不同,is判断结果为False,这和None的单例特性形成了明显对比。
内容的提问来源于stack exchange,提问作者user10910528
相关产品推荐
相关产品推荐

