gpt4 book ai didi

python - 在函数中调用 locals() 不直观?

转载 作者:太空狗 更新时间:2023-10-29 22:26:25 24 4
gpt4 key购买 nike

这可能是初级的,但可以帮助我理解命名空间。 一个很好的解释可能会逐步说明当 function definition 被执行,然后后面会发生什么 当函数 object 被执行时。 递归可能会使事情复杂化。

结果对我来说并不明显;我本以为:

locals_1 将包含 var; locals_2 将包含 var 和 locals_1;和 locals_3 将包含 var、locals_1 和 locals_2

# A function calls locals() several times, and returns them ...
def func():
var = 'var!'
locals_1 = locals()
locals_2 = locals()
locals_3 = locals()
return locals_1, locals_2, locals_3

# func is called ...
locals_1, locals_2, locals_3 = func()

# display results ...
print 'locals_1:', locals_1
print 'locals_2:', locals_2
print 'locals_3:', locals_3

结果如下:

locals_1: {'var': 'var!', 'locals_1': {...}, 'locals_2': {...}}
locals_2: {'var': 'var!', 'locals_1': {...}, 'locals_2': {...}}
locals_3: {'var': 'var!', 'locals_1': {...}, 'locals_2': {...}}

模式似乎是,对 locals 进行 (n) 次调用,所有
返回的 locals-dicts 是相同的,它们都包括 第一个 (n-1) 个 locals-dicts。

谁能解释一下?

更具体地说:

为什么 locals_1 包含自己?

为什么 locals_1 包含 locals_2? locals_1 是在什么时候赋值的 func 是被创建,还是被执行?

为什么 locals_3 没有包含在任何地方?

“{...}”是否表示“无限递归”?有点像 那些镜子相对的照片?

最佳答案

让我们运行这段代码:

def func():
var = 'var!'
locals_1 = locals()
print(id(locals_1), id(locals()), locals())
locals_2 = locals()
print(id(locals_2), id(locals()), locals())
locals_3 = locals()
print(id(locals_3), id(locals()), locals())
return locals_1, locals_2, locals_3


func()

这将在输出中:

44860744 44860744 {'locals_1': {...}, 'var': 'var!'}
44860744 44860744 {'locals_2': {...}, 'locals_1': {...}, 'var': 'var!'}
44860744 44860744 {'locals_2': {...}, 'locals_3': {...}, 'locals_1': {...}, 'var': 'var!'}

locals() 在这里按预期增长,但是您将 reference 分配给 locals(),而不是 valuelocals() 到每个变量。

每次赋值后 locals() 都会改变,但引用不会,所以每个变量都指向同一个对象。在我的输出中,所有对象 id 都相等,这就是证明。

更长的解释

这些变量具有指向该对象的相同链接(引用)。基本上,Python 中的所有变量都是引用(类似于指针的概念)。

        locals_1            locals_2                 locals_3
\ | /
\ | /
V V V
---------------------------------------------
| single locals() object |
---------------------------------------------

他们完全不知道 locals() 有什么值(value),他们只知道在需要的时候从哪里得到它(当变量在某处使用时)。 locals() 的更改不会影响这些变量。

在你的函数结束时你返回三个变量,这就是你打印它们时发生的事情:

print(locals_N) -> 1. Get object referenced in locals_N
2. Return the value of that object

看到了吗?所以,这就是为什么它们具有完全相同的值,即 locals()print 时刻具有的值。

如果您再次更改 locals()(以某种方式)然后运行 ​​print 语句,什么会被打印 3 次?是的,locals() 的新值。

关于python - 在函数中调用 locals() 不直观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345082/

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