作用域与执行
常用的作用域与执行内置函数:
| 函数 | 说明 | 示例 |
|---|---|---|
globals() | 返回全局命名空间的字典 | globals()['x'] |
locals() | 返回当前局部命名空间的字典 | locals()['y'] |
eval(expr) | 执行表达式字符串并返回结果 | eval('1 + 2') → 3 |
exec(code) | 执行语句块字符串,无返回值 | exec('a = 1') |
compile(src, file, mode) | 把源码编译为代码对象 | mode:exec / eval / single |
__import__(name) | 按字符串名称导入模块,import 语句的底层实现 | __import__('math') |
示例
x = 10
def demo():
y = 20
print(locals()) # {'y': 20},函数内的局部命名空间
demo()
print(globals()['x']) # 10
# eval:执行表达式,返回结果
print(eval('1 + 2')) # 3
print(eval('[i ** 2 for i in range(3)]')) # [0, 1, 4]
# exec:执行语句块,没有返回值
exec('a = 1 + 1\nprint(a)') # 2
# compile:先编译为代码对象,再交给 exec 执行
code = compile('print("hello")', '<string>', 'exec')
exec(code) # hello
# __import__:按字符串名称导入模块
math = __import__('math')
print(math.sqrt(4)) # 2.0
⚠️
eval、exec、__import__会执行动态代码,对不可信来源的字符串使用有安全风险,应避免在生产代码中执行用户输入。