python的作用域、globals()-全局变量 和 locals()-局部变量

目录

查看全局变量和局部变量

变量解析规则

变量生存周期


在python中,函数会创建一个自己的作用域,也称为为命名空间。当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找。

我们自己定义的全局变量均在python内建的globals()函数中,以字典的形式保存。而locals()函数返回的是函数内部本地作用域中的变量名称字典。

查看全局变量和局部变量

a = 1


def b():
    e = 2
    print(locals())
    
    
class C:
    def __init__(self):
        pass
    
    
print(globals())
b()

输出结果

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005055C0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/qqq.py', '__cached__': None, 'a': 1, 'b': <function b at 0x00000000004BC1E0>, 'C': <class '__main__.C'>}
{'e': 2}

由此可以看出,函数都有各自独立的命名空间。

通过全局变量,可以知道内置属性__file__指的是当前运行的文件名称,__name__指的是__main__。

变量解析规则

在python的作用域规则里面,创建变量时一定会在当前作用域里创建同样的变量,但访问或修改变量时,会在当前作用域中查找该变量,如果没找到匹配的变量,就会依次向上在闭合作用域中进行查找,所以在函数中直接访问全局变量也是可以的。

 但是变量在调用之前必须被声明,否则报错。

var = "this is a global variable"


def test():
    print("在test函数内调用var:" + var)


test()
print(a)

输出结果

在test函数内调用var:this is a global variable
Traceback (most recent call last):
  File "D:/yibo/_git/study-notes/qqq.py", line 9, in <module>
    print(a)
NameError: name 'a' is not defined

需要注意的是我们在调用print()函数时,并没有定义这个函数,为什么没有报错?

这是因为,如果在全局变量中没有找到函数的变量时,还会去“__builtins__”对应的作用域去查找,我们常用的Python内建函数均放在这个作用域中。

print(globals()["__builtins__"].__dict__)

输出结果

{'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': <class '_frozen_importlib.BuiltinImpo
<think>我们被要求生成关于Pythonglobals()locals()的相关题目。根据之前的讨论,我们已经详细解释了这两个函数,现在需要设计一些相关的练习题或问题。 注意:题目要围绕globalslocals,可以包括它们的行为、区别、使用场景等。 设计思路: 1. 基础概念题:测试对两个函数返回内容的了解。 2. 作用域题:在不同作用域(全局、函数、类)下使用这两个函数。 3. 修改行为题:测试对两个函数返回字典的可修改性的理解。 4. 动态创建变量题:利用globals()动态创建变量。 5. 综合应用题:结合其他概念如exec、嵌套函数等。 根据上述思路,我们设计以下题目: 题目1(基础): 在Python的全局作用域中,执行以下代码后,输出是什么? a = 10 b = 20 print('a' in globals()) print('b' in locals()) print(globals() is locals()) 题目2(函数作用域): 以下代码的输出是什么? x = 5 def func(): y = 10 print('x' in globals()) print('y' in locals()) print('x' in locals()) func() 题目3(修改行为): 以下代码的输出是什么?为什么? def func(): a = 1 locals()['a'] = 2 print(a) globals()['x'] = 100 func() print(x) 题目4(动态创建): 使用globals()动态创建一个全局变量'dynamic_var'并赋值为'hello',然后打印该变量。请写出代码。 题目5(综合): 以下代码的输出是什么?解释原因。 global_var = 1 def outer(): outer_var = 2 def inner(): inner_var = 3 print('inner_locals:', sorted(locals().keys())) print('inner_globals:', 'global_var' in globals()) inner() print('outer_locals:', sorted(locals().keys())) outer() 题目6(陷阱题): 在函数中,我们能否通过修改locals()来改变局部变量?为什么? 题目7(类中的行为): 在类方法中,locals()globals()分别包含什么?尝试编写一个类来展示。 注意:我们生成的是题目,所以不需要给出答案,但为了完整性,我们可以在内部保留答案(用户要求生成题目,所以只提供题目)。 但根据用户要求,我们只需要列出问题。所以我们将问题整理如下: </think> ### Python中`globals()`与`locals()`相关题目 #### 1. **基础概念题** ```python x = 10 def func(): y = 20 # 问题:分别写出此处 globals() locals() 包含的键 print(globals().keys()) # 包含哪些键? print(locals().keys()) # 包含哪些键? func() ``` **考点**:理解两个函数返回的字典内容差异[^2]。 --- #### 2. **作用域辨析题** ```python z = 5 def outer(): z = 15 def inner(): # 问题:以下三行输出分别是什么? print(z) # 输出? print(globals()['z']) # 输出? print(locals()) # 输出内容? inner() outer() ``` **考点**:嵌套作用域中变量的查找优先级[^1]。 --- #### 3. **可修改性实验题** ```python def test(): a = 100 locals()['a'] = 200 # 尝试修改局部变量 globals()['b'] = 300 # 尝试创建全局变量 # 问题:ab的值分别是什么? print(a) # 输出? print(b) # 输出? test() ``` **考点**:验证`locals()`的不可修改性与`globals()`的可修改性[^3]。 --- #### 4. **动态编程实践题** ```python # 要求:使用 globals() 动态创建变量 var1~var5 for i in range(1, 6): # 补全代码 ________ = i * 10 # 验证 print(var3) # 应输出30 ``` **考点**:利用`globals()`实现动态变量创建。 --- #### 5. **综合陷阱题** ```python x = "global" def confusing(): print(x) # 输出? x = "local" # 取消注释会怎样? print(locals().get('x')) confusing() ``` **考点**:变量声明顺序对`locals()`的影响UnboundLocalError机制。 --- #### 6. **类与实例分析题** ```python class MyClass: class_var = "类变量" def __init__(self): self.x = 1 def method(self): # 问题:以下输出包含哪些键? print(locals().keys()) # 输出? print(globals().keys()) # 输出? obj = MyClass() obj.method() ``` **考点**:类方法中局部作用域的特殊性。 --- #### 7. **函数式编程题** ```python def factory(): cache = {} def inner(x): # 要求:用locals()实现缓存机制 if x in ________: # 应替换为什么? return cache[x] result = x ** 2 ________[x] = result # 应替换为什么? return result return inner f = factory() print(f(3)) # 首次计算 print(f(3)) # 从缓存读取 ``` **考点**:闭包中`locals()`的灵活应用。 > 所有题目需在Python环境中验证结果,注意作用域生命周期的动态特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值