zoukankan      html  css  js  c++  java
  • python之golbal/nonlocal

    一、关键字

    golbal nonlocal

    在局部修改全局的变量为什么会报错

    count = 0
    
    def func():
        count += 1
    func()
    # UnboundLocalError: local variable 'count' referenced before assignment
    # 解释器认为:如果你在局部作用域对一个变量进行修改了,你在局部作用域已经定义好这个变量了。
    

    解释器认为: 如果你在局部作用域对一个变量进行修改,name你在局部作用域已经定义好这个变量了。

    1. global (***)

    用途

    • 可以在局部作用域申明一个全局变量

    例题

    def func():
    	global name # 用法
    	name = 'alex'
    	print(locals())
    func()
    
    # 总结
    # 申明一个变量的方法:global name
    
    • 可以在局部修改一个全局变量

    例题

    count = 0
    
    def func():
        global count
        count += 1
    
    print(count)
    func()
    print(count)
    
    # 输出结果
    0
    1
    
    总结:
    # 程序从上往下执行,先定义一个局部变量count = 0,然后往下执行,到print(count),这时候count指向的还是0,到func()也就是变量名加括号,开始执行定义函数,进入函数内部,声明count为全局变量,然后对count进行修改+1,跳出函数执行print(count),这个时候count已经+1操作,结果是1
    

    2. nonlocal (了解)

    用途

    • nonlocal不能操作全局变量
    • nonlocal 可以对父级作用域的变量进行修改,并且在当前作用域创建

    例题

    def func():
        count = 0
        def inner():
            nonlocal count
            count += 1
            print(count)
            print(locals())
        inner()
        print(locals())
    func()
    
    
    # UnboundLocalError: local variable 'count' referenced before assignment
    
    # 在没有申明一个nolocal的情况下,定义函数在子局部对父局部的变量进行修改也会报错,原因如下:
    # 解释器认为:如果你在局部作用域对一个变量进行修改了,
    # 你在局部作用域已经定义好这个变量了。
    

    一句话总结

    全局有count = 0 这个变量,或者在函数内部申明一个global count,此时在局部才可以对全局变量进行修改

    # 正确的操作方法
    count = 0
    def func():
    	global count
    	count += 1
    	return count
    print(func())
    
  • 相关阅读:
    OpenGL(十一) BMP真彩文件的显示和复制操作
    OpenGL(十) 截屏并保存BMP文件
    复数的认识与理解
    复数的认识与理解
    采样定理
    采样定理
    How Many Fibs_hdu_1316(大数).java
    FZOJ2110 star(DFS)
    透过表象看本质!?之二数据拟合
    设计中的道理_3
  • 原文地址:https://www.cnblogs.com/zanao/p/11054572.html
Copyright © 2011-2022 走看看