Python干货-变量的作用域

本文深入探讨了Python中变量作用域的概念,包括局部作用域、闭包函数外的函数作用域、全局作用域和内建作用域。通过实例说明了变量的访问顺序,并解释了如何使用global和nonlocal关键字来修改不同作用域内的变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Python程序设计中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的

变量作用域

变量的作用域一共分4种:

  1. 局部作用域(Local)
  2. 闭包函数外的函数中(Enclosing)
  3. 全局作用域(Global)
  4. 内建作用域(Built-in)

变量的访问顺序为:

先查找局部作用域,如果没有则在装饰函数外的函数中查找,如果没有则在全局作用域查找,如果没有则在内建作用域查找

示例:

x = int(2.9)  # 内建作用域,内建作用域变量一般可以在python的库中找到

g_count = 0  # 全局作用域 
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

在Python程序设计中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其他的代码块(如 if/elif/else/、tyr/except、for/while等)不会引用新的作用域,也就是说,这些语句内定义的变量,在外部也可以访问

示例:

if True:
    m1 = 'if中变量'
else:
    m2 = 'esle中变量'

# 在外部访问
print(m1)
if中变量
def test():
    test_value = '函数中变量'

# 在外部访问
print(test_vale)
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-7-9b9316eb7ed1> in <module>()
      3 
      4 # 在外部访问
----> 5 print(test_vale)


NameError: name 'test_vale' is not defined

区分全局变量与局部变量

# 定义在函数外在的变量为全局变量
total = 0 

def sum(arg1, arg2):
    # 定义在函数内部的变量为局部变量
    total = arg1 + arg2
    print('函数内部是局部变量', total)
    return total

# 调用sum函数
sum(50, 80)
print('函数外部是全局变量', total)
函数内部是局部变量 130
函数外部是全局变量 0

可以看出,虽然全局变量与局部变量的名称一样,但它们可被访问的空间是不一样的。如果在内部定义一个与外部全局变量一样名称的变量,会优先操作局部变量

global 和 nonlocal 关键字

这两个关键字可以在内部作用域修改外部作用域的变量,global适用于操作全局变量,noncloal适用于闭包外的函数中的变量

示例:

num = 1

def fun1():
    global num  # 使用 global 关键字声明,来使用全局变量num
    print('在内部打印外部全局变量 num', num)
    num = 123  # 重新为外部变量num赋值
    print('在内部改变外部全局变量num的值', num)
    
print('未调用函数前num的值', num)
fun1()
print('调用函数后num的值', num)
未调用函数前num的值 1
在内部打印外部全局变量 num 1
在内部改变外部全局变量num的值 123
调用函数后num的值 123
def outer():
    num = 10
    def inner():
        nonlocal num  # 声明nonlocal关键字来使用闭包外部的变量
        print('在嵌套函数中使用num的值', num)
        num = 100  # 改变num的值
        print('嵌套函数中改变num的值', num)
    # 调用嵌套函数
    inner()
    print('调用嵌套函数后num的值', num)
outer()
在嵌套函数中使用num的值 10
嵌套函数中改变num的值 100
调用嵌套函数后num的值 100
### CCS 调试会话初始化失败的原因分析 CCS(Code Composer Studio)调试会话初始化失败通常由多种原因引起,包括硬件连接问题、软件配置错误以及目标设备不兼容等。以下是可能的解决方案: #### 1. **检查硬件连接** 确保开发板与计算机之间的物理连接正常。如果使用的是 USB 连接线,则需确认其质量良好并无损坏。此外,还需验证 JTAG 或 UART 接口是否已正确设置并牢固插好。 #### 2. **驱动程序安装** 有时,调试器无法识别是因为缺少必要的驱动程序。对于 TI 的 LaunchPad 和其他评估模块,应下载最新的 [TI 驱动程序](https://www.ti.com/tool/CCSTUDIO)[^2] 并重新启动系统以应用更改。 #### 3. **项目配置校验** 在某些情况下,项目的构建选项未针对所使用的微控制器型号进行优化也可能引发此问题。打开 `Project Properties` 对话框,在 `Build Configuration` 下核对以下参数: - 设备类型 - 编译工具链版本 - 输出文件路径 另外,若涉及自定义组件加载逻辑如引用中的代码片段所示[^1],则需要进一步审查这些扩展功能是否会干扰正常的调试流程。 ```csharp private void InitializeComponent(){ ... this.controller.ConfiguredViews.Add("txtID", new Mvc.Components.Controller.ViewInfo("txtID", "Text", "Publisher", "ID")); this.controller.ConfiguredViews.Add("txtName", new Mvc.Components.Controller.ViewInfo("txtName", "Text", "Publisher", "Name")); } ``` 上述 C# 片段展示了如何向视图集合添加字段描述符;然而它属于 .NET MVC 架构范畴而非嵌入式领域内的操作,因此除非存在跨平台集成场景否则一般不会影响到 CCS 行为。 #### 4. **清除缓存数据** 尝试清理旧版编译残留物来排除潜在冲突因素。具体做法如下: - 删除 workspace 文件夹下的 `.metadata/.plugins/com.ti.ccstudio.debug.core` 子目录; - 关闭 IDE 后手动移除临时对象 (.o,.out) 及映像(.map). #### 5. **查看控制台日志** 正如提示消息建议那样,“See console for details”,通过阅读终端窗口打印出来的诊断信息往往能定位确切故障源。例如常见的有权限不足、端口号占用或者固件升级异常等等情况。 --- ### 总结 综上所述,当遇到 “CCS Debug Session Initialization Failed” 错误时可以从以上几个方面逐一排查直至找到根本诱因加以修正。得注意的是实际执行过程中还应当密切留意官方文档指南更新动态以便及时获取最新支持策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值