ZetCode

Python locals 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨 Python 的 locals 函数,该函数返回一个表示当前本地符号表的字典。我们将介绍基本用法、实际应用和常用模式。

基本定义

locals() 函数返回当前本地符号表的字典。在函数块中,这包括局部变量。在模块级别,它与 globals() 相同。

主要特点:返回一个可变字典,反映当前的局部变量。对字典的更改可能不会影响局部变量。可用于调试和动态变量访问。

基本用法

这是一个简单的用法示例,展示了 locals() 如何捕获不同作用域中的局部变量。 这演示了它的基本行为。

basic_locals.py
def show_locals():
    x = 10
    y = "hello"
    print(locals())

show_locals()  # {'x': 10, 'y': 'hello'}

a = 1
b = 2
print(locals())  # Includes a, b and many other entries

此示例显示了函数内部和模块级别的 locals()。 在函数内部,它仅显示局部变量。 在模块级别,它显示所有全局符号。

模块级输出将会很大,因为它包含所有导入的名称和特殊变量,如 __name__

动态变量创建

虽然可以,但不鼓励使用 locals() 动态创建变量。 此示例显示了为什么它通常不像预期的那样工作。

dynamic_vars.py
def create_vars():
    lcls = locals()
    lcls['new_var'] = 42
    print(new_var)  # NameError: name 'new_var' is not defined

try:
    create_vars()
except NameError as e:
    print(f"Error: {e}")

这表明修改 locals 字典实际上不会在函数作用域中创建新的局部变量。 该字典在函数中是一个副本。

在模块级别,修改 locals() 可以工作,但由于不明确的行为和可维护性问题,仍然不建议使用。

调试工具

locals() 通常用作调试工具来检查当前变量。 此示例显示了一个实际的调试场景。

debugging.py
def complex_calculation(a, b):
    temp1 = a * 2
    temp2 = b ** 3
    result = temp1 + temp2
    
    # Debug print
    print("Variables at checkpoint:", locals())
    return result

print(complex_calculation(3, 4))  # Variables: {'a': 3, 'b': 4, ...}

这显示了 locals() 如何通过在执行的特定点显示所有局部变量来帮助调试复杂函数。

输出包括函数参数、临时变量和结果变量,从而全面了解函数的状态。

使用 locals() 进行字符串格式化

locals() 可以通过自动使用局部变量来简化字符串格式化。 此示例演示了此模式。

formatting.py
def format_user(name, age, city):
    message = "{name} is {age} years old and lives in {city}".format(**locals())
    return message

print(format_user("Alice", 30, "New York"))
# Alice is 30 years old and lives in New York

此技术使用局部变量字典为字符串格式化提供值。 它很简洁,但会使代码对其输入不太明确。

虽然很方便,但在变量很多或者在格式化之前修改变量时,这种方法可能会变得不清楚。

类作用域行为

locals() 在类定义中的行为与在函数中的行为不同。 此示例探讨了它在类作用域中的行为。

class_scope.py
class MyClass:
    class_var = "shared"
    
    def __init__(self, instance_var):
        self.instance_var = instance_var
    
    @classmethod
    def show_locals(cls):
        print("Class method locals:", locals())
    
    def show_instance_locals(self):
        print("Instance method locals:", locals())

print("Class definition locals:", locals().keys())
MyClass.show_locals()
obj = MyClass("unique")
obj.show_instance_locals()

这表明在类定义期间,locals() 显示类命名空间。 在方法中,它显示方法的局部变量。

类方法的 locals 包括 cls,而实例方法包括 self 和任何局部变量。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程