gpt4 book ai didi

用于包含范围的 Python locals()

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

TL;DR:我想要一个在包含范围内查找的 locals()。

大家好。

我正在为一些化学家 friend 讲授 Python 编程类(class),我想确保自己真正了解范围。

考虑:

def a():
x = 1
def b():
print(locals())
print(globals())
b()

Locals 打印一个空环境,而 globals 打印通常的全局变量。如何访问存储 x 的环境?显然口译员知道它,因为我可以引用它。

相关:范围界定何时发生?仅当包含 x=3 时,a = x+2 上的以下名称错误:

def a():
x = 1
def b():
a = x+2
x = 3
b()

如果您注释掉 x=3,则代码有效。这是否意味着 python 会在解释代码之前对其进行词法作用域传递?

最佳答案

您的代码中发生的事情是,当 python 在您的 b() 方法中看到 x=3 行时,它正在重新创建 xb 函数中使用范围,而不是在 a 函数中使用 x 范围。

因为你的代码然后:

    a = x+2
x = 3

意思是在引用它之前需要定义内部作用域的x

但是,当您没有在 b 函数中分配 x 时,python 不会尝试创建一个较低范围的 x 并且不会抛出任何错误。

下面的代码将说明这一点:

def a():
x = 1
def b():
x = 3
print (x)

def c():
print (x)

b()
c()
print (x)

a()

但是,如果您要将 x 声明为 global,则可以在函数中使用它,如下所示:

def a():
global x
x = 1

def d():
global x
x += 2

print (x)
d()
print (x)

a()

Python 3 还添加了一个 nonlocal 关键字,可以让您从封闭范围访问变量,用法如下:

def a():
x = 1

def d():
nonlocal x
x += 2

print (x)
d()
print (x)

a()

将打印与 global 示例相同的结果。


如果我误读了问题:

根据对 Get locals from calling namespace in Python 的回答:

你可以使用:

import inspect

def a():
x = 1

def d():
frame = inspect.currentframe()
try:
print (frame.f_back.f_locals)
finally:
del frame
d()

a()

获取函数调用者的本地作用域。

关于用于包含范围的 Python locals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077627/

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