python种局部变量和全局变量之隐藏机制

本文探讨Python中局部变量和全局变量的隐藏机制,解释为何局部变量与全局变量同名时会导致全局变量被隐藏,并引发错误。文章提供两种解决方案:使用nonlocal关键字和将变量存储在list中。

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

python中局部变量和全局变量之隐藏机制

函数中可以访问全局变量但是还有个隐藏机制会始报错

x=5
def f():
    x=10 #若是局部变量赋值与全局变量相同 此时用的是局部变量,因为当局部变量和全局变量具有相同的变量名时 全局变量被隐藏了
    return x
print(f())#结果是10

x=5
def f():
    x=10*x #报错 未被赋值的引用错误  是因为当局部变量和全局变量同名时 全局变量被隐藏了
    return x
print(f())

怎么解决呢 有两个办法

1.nonlocal关键字

nonlocal只能在闭包里使用,只需要在函数里声明一下变量不是局部变量就好了


def f1():
    x=5
    def f2():
        nonlocal x
        x*=x
        return x
    return f2()
print(f1())

2。存到到list里去 因为list存储在栈里面 用的时候就从栈里面取 就相当于一个全局变量
x=[5]
def f():

    x[0]=x[0]*x[0] 
    return x[0]
print(f())
### Python局部变量全局变量的区别 在 Python 编程中,理解局部变量全局变量之间的区别至关重要。这不仅影响到代码的行为,也涉及到性能优化[^1]。 #### 定义与作用域 - **全局变量**是在函数外部定义的变量,或者通过 `global` 关键字显式声明为全局的变量。这些变量可以在整个文件范围内访问,并且其生命周期贯穿于程序运行期间。 - **局部变量**则是在函数内部创建并初始化的变量,默认情况下仅限于此函数的作用范围之内;当该函数调用结束时,局部变量会被销毁除非被返回给调用者或其他方式保存下来。 #### 访问规则 尝试在一个函数体内修改未声明为 global 的同名全局变量将会导致新创建一个具有相同名称但是不同作用域(即局部)的新对象而不是改变原来的那个全局对象。如果想要真正意义上更新已存在的全局变量,则需先利用 `global` 或者 `nonlocal`(针对嵌套函数中的外层非全局变量)关键字来指明意图。 ```python x = "outside" def my_function(): global x # 明确指出要操作的是外面的那个 x 变量 x = "inside" my_function() print(x) # 输出: inside ``` #### 使用场景最佳实践 为了保持良好的编程习惯以及提高可读性维护性: - 尽可能减少使用全局状态,因为过多依赖它会使程序难以理解调试; - 如果确实有必要共享数据,在类属性、模块级常量或是配置管理工具之间做出合理选择; - 对于那些只应在特定逻辑单元内使用的临时值应当作为局部变量处理,这样可以避免意外干扰其他部分的工作环境。 #### 示例代码展示 下面是一个简单的例子展示了如何区分两者及其相互关系: ```python # 全局变量 counter = 0 def increment_counter(value): global counter # 修改前必须声明 local_var = value * 2 # 局部变量 counter += local_var # 正确地改变了全局变量 return f"New Counter Value:{counter}" result = increment_counter(5) print(result) # New Counter Value:10 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值