gpt4 book ai didi

python - 查询在 python 中返回本地范围的对象

转载 作者:行者123 更新时间:2023-11-28 22:45:43 24 4
gpt4 key购买 nike

下面是返回定义在函数f中的function类型对象的程序,它的栈帧(f1)在程序退出之前仍然存在.

enter image description here


下面是程序返回值为1024的int类型对象,但是返回int类型对象后栈帧不存在?

enter image description here


根据上面的两个图,当你返回 int 类型的对象时,为什么在返回类型机制上存在这种差异,其中 frame 不存在。

当返回function 类型的对象时,堆栈帧处于事件状态的想法是什么?

最佳答案

除非明确要求,否则 Python 从不进行复制(例如,切片列表确实要求 Python 浅层复制列表的那部分)。

“add_three 是否指的是 n 指向的同一个 int 对象?” -- 是的,只有对该 int 的引用被传递并保存在框架中。在这种情况下,这适用于 n 的任何值。

任何 Python 实现都允许保留一个或多个不可变对象(immutable对象)行 int 的副本——无论哪种实现最方便,只要语义不受影响。

因此在给定的实现中,可能会发生每次提及文字 3 都指代相同的 int 对象,但提及文字 333 需要不是。例如:

2>>> a=333; b=333; print(id(a), id(b))
(4298804944, 4298804944)
2>>> a=333
2>>> b=333
2>>> print(id(a), id(b))
(4298753600, 4298753336)

两种情况的语义完全相同;在第一种情况下,编译器(本质上一次在整行上调用)发现实例化和使用单个 int333 很方便,在第二种情况下它更喜欢制作并使用两个这样的实例——考虑到 int 的不可变性,任何一个都完全没问题(其他数字类型、字符串、元组、卡住集也是如此——但可变类型则不然)。

请注意,当 Python 规范提到“相同语义”时,它明确包含自省(introspection),这可能能够查明语义等效状态之间的实现差异。

id(通常返回对象的内存地址,在当前流行的 Python 实现中,但在任何情况下,根据语言规范,只要对象存在,每个对象的 id 都是唯一的)是自省(introspection),因此 is 运算符也是如此。因此,如果您希望使用它来了解给定实现可能执行或不执行的一些优化,您可以这样做。

接着你的其他问题:“我的理解正确吗?” - 不。“为什么会有这种差异”——def 构建了一个可变的函数对象,因此任何 def 即使具有相同的函数定义也必须返回一个新对象,就像 >[] 构建一个可变的列表对象,因此任何 [] 都必须返回一个新对象。 3 构建一个不可变的 int 对象,因此允许任何 3(根据语言规则)返回相同或新的对象.

在编辑中添加了另一个问题:“当返回函数类型对象时,堆栈框架处于事件状态的想法是什么?”

答案:只要可到达,每个对象都会保持事件状态。特别是,只要返回内部(嵌套)函数,外部函数的框架就会保持事件状态,前提是它们引用外部框架中的名称。

(任何 Python 实现都必须对不再需要存活的对象进行垃圾回收——它可以根据需要延迟垃圾回收,或者可以执行马上——实现细节!-)。

关于python - 查询在 python 中返回本地范围的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com