首页 > 编程语言 >python中global 和 nonlocal 的作用域

python中global 和 nonlocal 的作用域

时间:2023-04-28 12:33:53浏览次数:35  
标签:do spam 作用域 global python add print def


python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 。

一 global

global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。


1 gcount = 0
2 
3 def global_test():
4     gcount+=1
5     print (gcount)
6 global_test()


D:\Python34\python.exe E:/PycharmProjects/Day3/globaltest.py
Traceback (most recent call last):
File "E:/PycharmProjects/Day3/globaltest.py", line 6, in <module>
global_test()
File "E:/PycharmProjects/Day3/globaltest.py", line 4, in global_test
gcount+=1
UnboundLocalError: local variable 'gcount' referenced before assignment

Process finished with exit code 1

第一行定义了一个全局变量,(可以省略global关键字)。

在global_test 函数中程序会因为“如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有gcount的定义和赋值,所以报错。

 

二、声明全局变量,如果在局部要对全局变量修改,需要在局部也要先声明该全局变量:

gcount            =            0          


                      


           def            global_test():          


                      global             gcount          


                      gcount           +           =           1          


                      print            (gcount)          


           global_test()



  如果在函数中声明 gcount 是全局变量,即可对其进行修改。 正确输出 1 。

 

三、 在局部如果不声明全局变量,并且不修改全局变量。则可以正常使用全局变量:

gcount            =            0          


                      


           def            global_test():          


                      print            (gcount)          


           global_test()



  如果在局部不修改全局变量,程序正确输出 0 。

 

四、nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。

def            make_counter():           


                      count            =            0           


                      def            counter():           


                      nonlocal count           


                      count            +           =            1           


                      return            count           


                      return            counter           


                      


           def            make_counter_test():           


                      mc            =            make_counter()           


                      print           (mc())          


                      print           (mc())          


                      print           (mc())          


                      


           make_counter_test()



  输出:

   1

   2

   3

五、

def            scope_test():          


                      def            do_local():          


                      spam            =            "local spam"            #此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错          


                      def            do_nonlocal():          


                      nonlocal  spam                   #使用外层的spam变量          


                      spam            =            "nonlocal spam"          


                      def            do_global():          


                      global            spam          


                      spam            =            "global spam"          


                      spam            =            "test spam"          


                      do_local()          


                      print           (           "After local assignmane:"           , spam)          


                      do_nonlocal()          


                      print           (           "After nonlocal assignment:"           ,spam)          


                      do_global()          


                      print           (           "After global assignment:"           ,spam)          


                      


           scope_test()          


           print           (           "In global scope:"           ,spam)




  输出是:

After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

 

 

在函数 add_b 内 global 定义的变量 b,只能在 函数 do_global 内引用, 如果要在 do_global 内修改,必须在 do_global 函数里面声明 global  b ,表明是修改外面的 全局变量 b :


def add_b():
    global  b
    b = 42
    def do_global():
        global  b
        b = b + 10
        print(b)
    do_global()
    print(b)
add_b()



 

global 定义的变量,表明其作用域在局部以外,即局部函数执行完之后,不销毁 函数内部以global定义的变量:



def add_a():
    global  a
    a =   3
add_a()
print(a)



输出 3 。

 


def add_b():
    global  b
    b = 42
    def do_global():
        global  b
        b = b + 10
        print(b)
    do_global()
    print(b)
add_b()
print(b)


以上代码输出:

52

52

52

 



def add_b():
    global  b
    b = 42
    def do_global():
        #global  b
        b = b + 10
        print(b)
    do_global()
    print(b)
add_b()


以上代码报错:

Traceback (most recent call last):
File "E:/PycharmProjects/OOP/exe1.py", line 42, in <module>
add_b()
File "E:/PycharmProjects/OOP/exe1.py", line 40, in add_b
do_global()
File "E:/PycharmProjects/OOP/exe1.py", line 38, in do_global
b = b + 10
UnboundLocalError: local variable 'b' referenced before assignment

原因: global 定义的 b ,只能引用,不能修改。

 



def add_b():
    global  b
    b = 42
    def do_global():
        global  a
        a = b + 10
        print(b)
    do_global()
    print(a)
add_b()
print("a = %s , b = %s " %(a, b))



输出:

42
52
a = 52 , b = 42

 

 

 



def add_b():
    #global  b
    b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    print(b)
add_b()
print(" b = %s " % b)




以上代码输出:

10
42
b = 10

 

 



def add_b():
    #global  b
    b = 42
    def do_global():
        nonlocal  b
        b =  10
        print(b)
    do_global()
    print(b)
add_b()



以上代码输出:

10

10

 

def            add_b():          


                      #global  b          


                      b            =            42          


                      def            do_global():          


                      nonlocal  b          


                      b            =             10          


                      print           (b)          


                      do_global()          


                      print           (b)          


           add_b()          


           print           (           " b = %s "            %            b)

 




  以上代码报错:

print(" b = %s " % b)
NameError: name 'b' is not defined

说明: nonlocal  适用于在局部函数 中 的局部函数, 把最内层的局部 变量设置成外层局部可用,但是还不是全局的。

 


def add_b():
    #global  b
    #b = 42
    def do_global():
        nonlocal  b
        b =  10
        print(b)
    do_global()
    #print(b)
add_b()



以上代码报错:

File "E:/PycharmProjects/OOP/exe1.py", line 37
nonlocal b
SyntaxError: no binding for nonlocal 'b' found

nonlocal 要绑定一个局部变量。

 

 

 


def add_b():
    #global  b
    #b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    print(b)
add_b()
print(" b = %s " % b)


以上代码输出:

10
10
b = 10

 

 



def add_b():
    #global  b
    #b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    #b  = b + 20
    print(b)
add_b()
b = b + 30
print(" b = %s " % b)



以上代码输出:

10
10
b = 40

 


def add_b():
    #global  b
    #b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    b  = b + 20
    print(b)
add_b()
b = b + 30
print(" b = %s " % b)



以上代码报错:

b = b + 20
UnboundLocalError: local variable 'b' referenced before assignment

 

 


def add_b():
    #global  b
    b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    b  = b + 5
    print(b)
add_b()
b = b + 30
print(" b = %s " % b)



以上代码输出:

10
47
b = 40

标签:do,spam,作用域,global,python,add,print,def
From: https://blog.51cto.com/u_16091571/6233826

相关文章

  • Python-运行库报错“ImportError: DLL load failed: 找不到指定的模块。”
    1.看到这个报错的一瞬间,以为是Pycharm有问题,加上公司的电脑,对于2020以后的版本的不适用,以为是Pycharm需要有改动。但是大费周章(不断安装卸载Pycharm)以后,依旧没有任何的改变。百度以后,说是第三方库的某个模块没有,让卸载三方库,重新安装。尝试过以后没有用。2.思考了两天,突然想到,这......
  • Python3多进程共享变量实现方法
    今天同事反映一个问题让帮忙看一下:多进程共用一个变量,在一个进程中修改后,在另外的进程中并没有产生修改。 一、错误的实现方式最初以为是没添加global声明导致修改未生效,但实际操作发现global方式在多进程中也只能读不能写。错误示例代码如下:importmultiprocessing#声......
  • Python3+WebSockets实现WebSocket通信
    一、说明1.1背景说明前段时间同事说云平台通信使用了个websocket的东西,今天抽空来看一下具体是怎么个通信过程。从形式上看,websocket是一个应用层协议,socket是数据链路层、网络层、传输层的抽像;从应用场合上看,websocket可以使用javascript实现,而socket不能用javascript实现(真......
  • Python单例的常用几种实现方法
    这两天在看自己之前写的代码,所以正好把用过的东西整理一下,单例模式,在日常的代码工作中也是经常被用到,所以这里把之前用过的不同方式实现的单例方式整理一下。装饰器的方式这种方式也是工作中经常用的一种,用起来也比较方便,代码实现如下defSingleton(cls):_instance={......
  • Python3+cgroupspy安装使用教程
    一、系统资源使用限制的必要性探讨对于一个脚本,最基础的限制是要限制单进程实例以保证了不会存在多个进程实例、在运行程序主体逻辑前检测系统资源剩余量确保自己不是压夸系统的最后一根稻草、设置程序运行超时时间以保证进程实例不会无休止地运行下去。进一步,在部署有可用性要......
  • Python3从头/尾删除子符串的正确操作
    一、说明从某个时候发现python的字符串变量自带的strip()方法,除了可以删除字符串头尾的空格,还可以用来删除头尾的字符串觉得很好用。也就一直这么用,一直也没发现什么问题。今天在修复一个bug时使用了strip()方法但从结果看bug并没有按预期被消除,一是没怀疑strip()删除子字符串有......
  • Python关于jsonpath路径里面包含中文或进行参数化的解决方案
    jsonpath路径包含中文当jsonpath路径包含中文时,我们只需要在jsonpath路径里面把中文用引号包裹即可准备json文件{"data":[{"Details":[{"姓名":"张三"}]}......
  • Python3文件路径/目录获取教程
    一、获取文件路径实现1.1获取当前文件路径importoscurrent_file_path=__file__print(f"current_file_path:{current_file_path}")__file__变量其实有个问题,当文件被是被调用文件时__file__总是文件的绝对路径;但当文件是直接被执行的文件时,__file__并不总是文件的绝对......
  • Python3压缩和解压缩实现
    一、说明压缩和解压缩是日常常用的操作,不管是windows上图形界面的操作,还是linux上用命令来进行压缩解压缩,总的而言都还是比较方便的。但用代码来实现就没做过,近期也得实现代码压缩与解压缩操作,所以就抽时间来研究一下。 二、zip文件压缩和解压缩实现importosimportzipf......
  • 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介策略模式(StrategyPattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。当你想使用对象中各种不同的算法变体,使用if...else所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅在执行某些行为时......