zoukankan      html  css  js  c++  java
  • Python中的全局变量与局部变量的区别

    全局变量与局部变量两者的本质区别就是在于作用域

    用通俗的话来理解的话,

    全局变量是在整个py文件中声明,全局范围内都可以访问

    局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了

    如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。因此不建议这样使用,这样会使得程序很不健全

    直接来看几个例子来理解全局变量和局部变量的区别吧:

    Demo1:

    1. def fun(x):  
    2.     y=2  
    3.     print("乘法的运行结果:",x*y)  
    4. num1=1  
    5. print("初始num1=",num1)  
    6. fun(num1)  
    7. print("y的值是:",y)  

    运行结果:

     

    报错的原因是因为试图访问局部变量,但是访问的地方不在该变量y的作用域中

     

    Demo2:

    1. def fun():  
    2.     num1=2  
    3.     print("函数内修改后num1=",num1)  
    4. num1=1  
    5. print("初始num1=",num1)  
    6. fun()  
    7. print("运行完函数后num1=",num1)  

    运行结果:

     

    可以看到在函数内部对全局变量的修改后,在函数执行完毕,修改的结果是无效的,全局变量并不会受到影响

    再看:

    Demo3:

    1. def fun():  
    2.     num1*=2  
    3.     print("函数内修改后num1=",num1)  
    4. num1=1  
    5. print("初始num1=",num1)  
    6. fun()  
    7. print("运行完函数后num1=",num1)  

    运行结果:

     

    报错了。这是因为在fun()函数使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值,因此再次强调不要这样使用

     

    global关键字

    如果真的想要在函数体内修改全局变量的值,就要使用global关键字

    Demo4:

    1. def fun():  
    2.     global num1  
    3.     num1=2  
    4.     print("函数内修改后num1=",num1)  
    5. num1=1  
    6. print("初始num1=",num1)  
    7. fun()  
    8. print("运行完函数后num1=",num1)  

     

    运行结果:

    使用global关键字就是告诉python编译器这个变量不是局部变量而是全局变量,其实有点像是"引用"的意思

     

    nonlocal关键字

    再看看另一个跟变量相关的关键字nonlocal,字面意思就是指当前的这个变量不是局部变量。nonlocal是Python3.0中新增的关键字,python2.x不支持

    先来看看下面这段代码

    1. def fun():  
    2.     num2=3  
    3.     def fun2():  
    4.         num2*=2  
    5.         print("num2=",num2)  
    6.     return fun2()  
    7.   
    8. fun()  

    运行结果:

     

    错误的原因跟前面的差不多,就是使用了未定义的局部变量,然而num2也不是全局变量,只是fun2函数的外层变量,强行使用global定义num2的话同样会报错(不信你试试)

    这时候需要使用nonlocal关键字: 

    1. def fun():  
    2.     num2=3  
    3.     def fun2():  
    4.         nonlocal num2  
    5.         num2*=2  
    6.         print("num2=",num2)  
    7.     return fun2()  
    8.   
    9. fun()  

    运行结果:

     

    如此,程序就能正常执行

  • 相关阅读:
    JS实现对Date Range的认证
    SharePoint 用SafeControl的方式创建能够重复利用的Control
    设计模式详解(链接)
    Asp.net MVC3中进行自定义Error Page
    手动将自定制的WebPart部署到 SharePoint 2010 中
    获取 SharePoint 2010 中所有的User Profile Service Application
    自定义Data Service Providers — (5)最小化的运行时服务
    温总理对软件工作者的勉励
    自定义Data Service Providers —(9)关系
    自定义Data Service Providers — (7)交互式查询
  • 原文地址:https://www.cnblogs.com/Archmage/p/7569817.html
Copyright © 2011-2022 走看看