python函数如何返回对象?

python函数如何返回对象?,python,Python,在下图中,我对函数f返回的nametemp进行了查询 在本地帧f中,temp是指向类int的对象6的参考变量,当您在f中说return temp时,作为checkPassingMech框架一部分的参考变量output将指向temp所指向的同一对象6 我的问题: 问题1)我的理解正确吗 Q2)如果Q1为是,则此图给出了一种错觉,即temp不是参考类型,并在框中显示其值,而不是用箭头指向6,对吗 Q3)如果Q2是肯定的,那么我可以说6实际上存储在堆中,temp和output将从帧(本地堆栈)指向这

在下图中,我对函数
f
返回的name
temp
进行了查询

在本地帧
f
中,
temp
是指向类
int
的对象
6
的参考变量,当您在
f
中说
return temp
时,作为
checkPassingMech
框架一部分的参考变量
output
将指向temp所指向的同一对象
6

我的问题:

问题1)我的理解正确吗

Q2)如果Q1为是,则此图给出了一种错觉,即
temp
不是参考类型,并在框中显示其值,而不是用箭头指向6,对吗

Q3)如果Q2是肯定的,那么我可以说
6
实际上存储在堆中,
temp
output
将从帧(本地堆栈)指向这个堆空间吗

发件人:

CPython实现细节:对于CPython,id(x)是内存 存储x的地址

严格来说,如果值是6,那么
output
temp
实际上指向同一个对象,这是python启动时缓存的
int
对象


有关更多信息,请参阅

是的,您的理解是正确的,除了Python的运行时只处理对象的引用(它们都位于堆中):Python堆栈上的内容(作为操作数和字节码操作的结果)总是引用(位于其他地方的值)

CPython实现中的所有Python对象都放在堆上。您可以在文档中详细阅读Python的内存管理工作原理:

Python中的内存管理涉及一个包含所有 Python对象和数据结构。这家私营企业的管理 堆由Python内存管理器在内部确保。巨蟒 内存管理器有不同的组件,用于处理各种 动态存储管理方面,如共享、细分、, 预分配或缓存

“类型几乎影响对象行为的所有方面。甚至对象标识的重要性在某种意义上也会受到影响:对于不可变类型,计算新值的操作实际上可能返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,这是不允许的。例如,a=1之后;b=1,a和b可能引用值为1的同一对象,也可能不引用,具体取决于实现,但在c=[]之后;d=[]、c和d保证引用两个不同的、唯一的、新创建的空列表。(请注意,c=d=[]将同一对象同时分配给c和d。)

所以你不能把一个箭头指向6,因为它不能保证每次都指向6。 2) 是的。没错,temp不是引用类型,因为它没有引用任何其他变量。 3) 是的,值6存储在堆中(在本场景中),无论输入和输出是否等于temp,temp都将指向6,这使得它等于6

您可以在该链接中获得有关引用类型的良好定义:

正确。此类图表通常采用将简单值(如小整数文本)视为离散对象的快捷方式,而不是对对象的引用,以避免弄乱图表。@chepner这是什么样的参数传递机制?返回temp的方式,因为在c中,我们不能这样做,我们会进入悬空指针,因为值存储在c中的本地堆栈中。我知道这是编译的lang,但我们可以比较param传递机制。Python没有指针,它只有引用。内存分配完全是解释器的工作。在Python级别,只有名称绑定到特定的作用域,对于内存管理系统来说,exi是否只要对象至少存在一个引用,sting引用就以全局或本地名称存储。@chepner对于您的点,指针不是引用,'int a=3;int*ptr=&a'在c中,'X X=new X()在java中,python中的“temp=6”,你不认为吗,ptr x temp正在存储存储值的内存地址?引用的实现方式完全取决于python实现。它们可能是通过指针实现的,也可能不是。实现与你的问题无关。
python堆栈上的内容是什么(由于操作数及其字节码操作的结果)始终是引用(指向存在于其他地方的值)
,您会详细解释它还是引用吗?
>>> def f():
    temp = 6
    print(id(temp))
    return temp

>>> output = f()
507107408
>>> id(output)
507107408