精华内容
下载资源
问答
  • python变量的作用域:局部变量和全局变量

    万次阅读 多人点赞 2018-08-10 18:14:10
    变量定义以后,是有一定的使用范围,称之为变量的作用域。比如Java中,变量的使用范围是变量声明时所在的{}范围,而python的作用域对应的为同一个缩进。按着变量的使用范围给变量划分成如下两种: 1.全局变量:...

           变量定义以后,是有一定的使用范围,称之为变量的作用域。比如Java中,变量的使用范围是变量声明时所在的{}范围,而python的作用域对应的为同一个缩进。按着变量的使用范围给变量划分成如下两种:

               1.全局变量:就是在函数外部定义的变量

               2.局部变量:就是在函数内部定义的变量

    1.全局函数和局部函数的作用域

      局部变量作用域:只能在被声明的函数内部访问,函数外部使用不了。

                                这也是不同函数里可以定义名称一样变量的原因

      全局变量作用域:可以在整个程序范围内访问,任意函数都可以访问

    #1.局部变量,外部访问不了
    def f1 (v1,v2): #参数也属于局部变量
        sum = v1+v2
        a = 5  #局部变量,函数外部访问不了
        return sum
    --------------------------------
    print(a) #报错,NameError: name 'a' is not defined
    =====================================================================
    
    #2.全部变量,函数里外都可以访问
    a =3
    def f3(v2):
      # a = a+1  注意:报错,因为局部作用域内只能引用全局域变量的值,而不能修改全局作用域的值。
      # b = a+1  则不会报错,引用全局变量的值,运算后给赋给局部变量b.
        return a+1   #外部的全局变量函数内部使用
    print(f3(1))
    =============结果如下======================
    4
    ===================================-===================================
    #3.如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的
    sum =5
    def f2(v2):
        sum =0
        while v2 < 10:
            sum += v2   #这里sum使用的是局部变量的初始值0,而不是全局sum=5
            v2 += 1
        return sum
    print(sum)
    print(f2(0))
    ===========结果如下=========================
    5     
    45
    ===========================================

    注意:1. PYTHON的作用域由def、class、lambda等语句产生,if、try、for等语句并不会产生新的作用域,换句话说就是if,try,for等语句里面定义的变量并不会随着该语句执行结束而回收,而是可以到处引用的,if,try,for等语句内变量作用域实际范围受其所在 的def,class,lambda范围约束

              2.当 Python 遇到一个变量的话他会按照这样的顺序进行搜索LEGB法则:本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in).具体什么是LEGB法则要等后面学完闭包后再讲,这里大致了解一下即可。

    2.作用域的划分LEGB

    1. L(local)局部作用域

          局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
    注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

    2.E(enclosing)嵌套作用域

          E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

    3.G(global)全局作用域

           即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
    注意:全局作用域的作用范围仅限于单个模块文件内

    4.B(built-in)内置作用域

        系统内固定模块里定义的变量,即系统自带的的变量函数之类的。如预定义在builtin 模块内的变量。

    globa  lVar = 100           #G
    
    def test_scope():
        enclosingVar = 200    #E
        def func():
            localVar = 300    #L
    print (__name__)            #B

    2.局部变量声明为全局变量global

    val =10
    def f1(v1):
        val =5
        return val
    print(val )  #结果是10,因为局部变量val作用域只是函数内
    print(f1(1))  #5
    
    #使用global将局部变量声明为全局变量
    val =10
    def f1(v1):
        global val
        val = 30
        return val
    print(val )  #结果是10.虽然声明了global,但是函数要调用才会执行,才会更新val的值
    
    ============================================================================
    val =10
    def f1(v1):
        global val
        val = 30
        return val
    f1(2)
    print(val )  #结果是30.调用函数f1后,将val的值给刷新了。
    

    统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。

    展开全文
  • python的 局部变量和全局变量

    万次阅读 2017-07-31 19:12:06
    全局变量:所有函数之外定义的变量局部变量:函数内部定义的变量 或者代码块里的变量1....如果这个变量名字全部变量名字相同,那么局部变量名字会覆盖全局变量名字。#[demo1] num = 100 def func(): newVa

    全局变量:所有函数之外定义的变量

    局部变量:函数内部定义的变量 或者代码块里的变量


    1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义了一个局部变量,不管全局域中有没有该变量名,函数中使用的将是局部变量。

    (即声明了一个新的局部变量。如果这个变量名字和全部变量名字相同,那么局部变量名字会覆盖全局变量名字。

    #[demo1]
    num = 100  
    def func():  
        newValue = 123   #一个全新的局部变量newValue 
        print(newValue)  
    
    func()  #输出局部变量newValue 即新的局部变量
    
    
    #[demo2]
    num = 100  
    def func():  
        num= 123  #声明一个全新的局部变量num,虽然名字和外界的全部变量相同 但是是新的一个变量且是局部有效的。屏蔽了外面的同名的全部变量
        print(num)  
    
    func()  #输出局部变量num=123 即新的局部变量。
    

    2.如果局部变量用到了一个变量。该变量是全局存在的,但是局部并没有声明这么一个变量。那么此时参与运算的是全局变量。但是这个参与运算是不能被赋值的,因为你赋值的时候按照python的语法那就是新生成一个局部变量,而且你在右侧使用的话。那就是会报错。

    #[demo1]
    num = 100  
    def func():  
        x = num+200  #使用值做参数,那么其实是copy一份num全部变量的值
        print(x)
        print(id(num))  #id值
    
    func()  #输出300  即没有局部变量声明 那么使用就是全局变量
    print(id(num))  #id值
    
    
    #[demo2]
    
    list = [100] 
    def func():  
        list.append(200) #直接使用变量,那么得到了全局变量 操作全局变量。
        print(list)
        print(id(list))
    
    func()  #输出[100,200]

    3.如果你想在局部变量修改全局变量。

    因为本身是不能的,你修改然后赋值的时候会出现矛盾。即你涉及到赋值var = xxx 修改的时候,那么会被语法解析会声明一个新的局部变量var。当然对象类型除外,你可以直接操作他的元素。

    #[demo1]
    num = 100  
    def func():  
        num= 123   #本来你的意图是赋值给全局变量Num,但是此处会被解析为声明一个全新的局部变量num
        print(id(num))  
    
    func()  #输出局部变量newValue 即新的局部变量
    print(id(num))
    
    那么怎么办?才能在局部变量赋值修改全局变量

    [关键字 global]

    #[demo1]
    Num = 100  
    def func():  
        global Num  #声明这个Num是全局的哦。如果全局变量已经有这个Num变量那就是指的它 如果全局没这个Num那就新定义一个全局变量。
        Num  = 200  #此时此刻 凡是在函数内部Num的意思始终是指全局变量。不可能有个局部变量叫Num的。
        print(Num )  
    
    func()  
    print(Num ) #输出200 说明修改的就是全局变量啊
    
    #[demo2]
    def func():  
        global Num  #声明这个Num是全局的哦。而且恰恰是此时没有一个全局变量是Num。那么如果全局没这个Num那就新定义一个Num的全局变量。
        Num  = 200  
        print(Num )  
    
    func()  
    print(Num ) #输出200 说明新定义了一个全局变量Num
    

    4.总结

    • 如果不是明显要局部变量和全局变量纠缠 能不纠缠就不纠缠。也就是定义变量名字的时候 要严格规范。按照开发规范来定义名字。全局大写或者加上“_”开头
      这是避免不必要问题的根本 消灭问题
    • 如果实在是场景需求 局部要操作修改赋值全局变量。那就使用global。
    展开全文
  • python的局部变量和全局变量区别

    千次阅读 2018-01-16 15:37:59
    全局变量:所有函数之外定义的变量 局部变量:函数内部定义的变量 或者代码块里的变量 ...如果这个变量名字全部变量名字相同,那么局部变量名字会覆盖全局变量名字。 #[demo1] num = 100 def fu

    全局变量:所有函数之外定义的变量

    局部变量:函数内部定义的变量 或者代码块里的变量


    1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义了一个局部变量,不管全局域中有没有该变量名,函数中使用的将是局部变量。

    (即声明了一个新的局部变量。如果这个变量名字和全部变量名字相同,那么局部变量名字会覆盖全局变量名字。

    #[demo1]
    num = 100  
    def func():  
        newValue = 123   #一个全新的局部变量newValue 
        print(newValue)  
    
    func()  #输出局部变量newValue 即新的局部变量
    
    
    #[demo2]
    num = 100  
    def func():  
        num= 123  #声明一个全新的局部变量num,虽然名字和外界的全部变量相同 但是是新的一个变量且是局部有效的。屏蔽了外面的同名的全部变量
        print(num)  
    
    func()  #输出局部变量num=123 即新的局部变量。
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.如果局部变量用到了一个变量。该变量是全局存在的,但是局部并没有声明这么一个变量。那么此时参与运算的是全局变量。但是这个参与运算是不能被赋值的,因为你赋值的时候按照python的语法那就是新生成一个局部变量,而且你在右侧使用的话。那就是会报错。

    #[demo1]
    num = 100  
    def func():  
        x = num+200  #使用值做参数,那么其实是copy一份num全部变量的值
        print(x)
        print(id(num))  #id值
    
    func()  #输出300  即没有局部变量声明 那么使用就是全局变量
    print(id(num))  #id值
    
    
    #[demo2]
    
    list = [100] 
    def func():  
        list.append(200) #直接使用变量,那么得到了全局变量 操作全局变量。
        print(list)
        print(id(list))
    
    func()  #输出[100,200]
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.如果你想在局部变量修改全局变量。

    因为本身是不能的,你修改然后赋值的时候会出现矛盾。即你涉及到赋值var = xxx 修改的时候,那么会被语法解析会声明一个新的局部变量var。当然对象类型除外,你可以直接操作他的元素。

    #[demo1]
    num = 100  
    def func():  
        num= 123   #本来你的意图是赋值给全局变量Num,但是此处会被解析为声明一个全新的局部变量num
        print(id(num))  
    
    func()  #输出局部变量newValue 即新的局部变量
    print(id(num))
    
    那么怎么办?才能在局部变量赋值修改全局变量
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    [关键字 global]

    #[demo1]
    Num = 100  
    def func():  
        global Num  #声明这个Num是全局的哦。如果全局变量已经有这个Num变量那就是指的它 如果全局没这个Num那就新定义一个全局变量。
        Num  = 200  #此时此刻 凡是在函数内部Num的意思始终是指全局变量。不可能有个局部变量叫Num的。
        print(Num )  
    
    func()  
    print(Num ) #输出200 说明修改的就是全局变量啊
    
    #[demo2]
    def func():  
        global Num  #声明这个Num是全局的哦。而且恰恰是此时没有一个全局变量是Num。那么如果全局没这个Num那就新定义一个Num的全局变量。
        Num  = 200  
        print(Num )  
    
    func()  
    print(Num ) #输出200 说明新定义了一个全局变量Num
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18



    定义

                a、全局变量:在模块内、在所有函数外面、在class外面,这就是全局变量。

                b、局部变量:在函数内、在class的方法内(未加self修饰的),这就是局部变量

                c、 静态变量:在class内的,但不在class的方法内的,这就是静态变量

                d、 实例变量:在class的方法内的,用self修饰的变量,这就是实例变量


      看完定义,同学们又懵逼一次了……………………我裤裆扯了…………好,下面整个代码实例(python版本2.7.11)

                 a、全局变量与局部变量

    [html]  view plain  copy
    1. #coding:utf-8  
    2. #例子仅仅是作为展示,实际工作中,请再思考  
    3.   
    4. ahead = 'HelloWorld' #全局变量  
    5. showList = [] #全局变量  
    6.   
    7. def printAhead():  
    8.     print ahead  
    9.   
    10. def printOther():  
    11.     city = 'beijing' #city是局部变量  
    12.     print city + ahead  
    13.   
    14. def printList():  
    15.     global showList #global代表引用全局变量,没办法,不写的话,showList就成局部变量了,赞吧  
    16.     showList.append(1)  
    17.     showList.append(2)  
    18.     print showList  
    19.   
    20. printAhead()  
    21. printOther()  
    22. printList()  

    输出结果:

    [html]  view plain  copy
    1. HelloWorld  
    2. beijingHelloWorld  
    3. [1, 2]  


    …………………………………………………………………………………………华丽丽的分割线………………………………………………………………………………

               b、静态变量与实例变量, 捎带又在class的方法中展示了局部变量,哈哈

    [html]  view plain  copy
    1. class Person(object):  
    2.     TAG = "Person" #静态变量  
    3.     def __init__(self, name):                     #self 当前的实例对象(简单的说一下,其实都是引用哈)  
    4.         print Person.TAG  #这里调用了静态变量  
    5.         self.personName = name #personName是实例变量 (简单说就是因为self,哈哈)  
    6.   
    7.     def printName(self):  
    8.         group = "BeiJing_"   #group是局部变量  
    9.         print group + self.personName  #self.personName, 调用实例变量  
    10.   
    11. if __name__ == "__main__":  
    12.     p = Person("WangYuanWai")  
    13.     p.printName()  


    输出结果:

    [html]  view plain  copy
    1. Person  
    2. BeiJing_WangYuanWai  



    展开全文
  • C++的局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。下面是一个实例: #include <iostream> using namespace std; // 全局变量声明 int g = 20; int main () { //...

    C++的局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。下面是一个实例:

    #include <iostream>
    using namespace std;
     
    // 全局变量声明
    int g = 20;
     
    int main ()
    {
      // 局部变量声明
      int g = 10;
     
      cout << g;
     
      return 0;
    }

     

    展开全文
  • 局部变量和全局变量,以及作用范围

    万次阅读 多人点赞 2018-11-11 13:56:55
    变量按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 变量按作用域分:  全局变量:在整个工程文件内都有效;“在函数外定义的变量”,即从定义变量...
  • /**********************************************...*函数内部定义局部变量全局变量重名时,函数在使用该变量的时候会以局部变量覆盖全局变量,也就是只有局部变量会起效果。 ********************************...
  • 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用 全局变量 1.什么是全局变量 如果一个变量,既能在一个...
  • 全局变量Global Variable全局变量会降低程序可读性!...局部变量Local Variable不同的函数及作用域中可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。复合语句的作用大家都知道 ca...
  • php中局部变量和全局变量

    千次阅读 2016-10-27 15:00:38
    php中局部变量和全局变量 ...在php中函数被视为单独的程序片,所以局部变量会覆盖全局变量,即使局部变量中并定义没有全局变量相同的变量,也会被覆盖。 如下: $a=5; $b=3; function t() {  echo $a-$b;//输
  • verilog全局变量和局部变量定义

    万次阅读 2016-06-17 17:28:56
    1、局部变量定义(parameter) 声明: parameter xx = 8; (注意有等号,且后面有分号) 使用:xx 作用域:parameter 作用于声明的...2.全局变量定义(`define )(注意撇号来自键盘左上方破浪线那个键,不是单引号
  • 全局变量在python中要大写,局部变量要小写 NAME = ‘ybl’ 这个变量没有任何的缩进,在项目任何地方都可以调用,这就是全局变量 ...如果这个变量名字全部变量名字相同,那么局部变量名字会覆盖全局变量名字 ...
  • 学习Python时看到一篇介绍python里局部变量和全局变量的帖子讲的挺好,无奈转载比较费事,只好手写。   当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来...
  • 关于ArrayList存储局部变量和全局变量的易错笔记
  • 局部变量和全局变量,externstatic

    千次阅读 2016-07-24 19:34:59
    局部变量和全局变量,externstatic
  • Python中都全局变量和局部变量

    千次阅读 2020-10-31 17:14:44
    1. 局部变量和全局变量是不同的变量,即使变量名相同 局部变量是函数中的占位符,与全局变量可能重名,但不是同一个变量 函数运行结束后,局部变量被释放 可以使用global保留字在函数中使用全局变量 看下面两个...
  • python 局部变量 vs 全局变量,global 修改全局变量 局部变量 以温度为栗,假设目前获取温度为33摄氏度,然后将该温度打印出来 #局部变量 def get_temp(): temp = 33 return temp def print_temp(): print('温度...
  • C语言局部变量和全局变量

    千次阅读 2015-01-13 18:29:59
    在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。...C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量局部变量 局部变量也称为内部变量。局部变量
  • 静态局部变量和全局变量的区别!

    千次阅读 多人点赞 2017-09-09 20:45:33
    静态局部变量和全局变量的区别!
  • 局部变量和全局变量试题

    千次阅读 2011-03-28 08:47:00
    局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用"::"局部变量可以全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一...
  • 实参、形参、局部变量和全局变量

    千次阅读 2020-09-15 16:53:39
    目录实参形参实参数据传递函数调用过程形参实参形参的关系局部变量和全局变量局部变量局部变量的作用域说明:全局变量全局变量说明: 实参形参 实参 实际参数简称“实参”。在调用有参函数时,函数名后面括号...
  • 当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点...
  • 全局变量在整个源文件的作用域都是有效的,只需要在一个源文件中定义全局变量,在其他不包含全局变量定义的源文件中用extern关键字再次声明这个全局变量即可。 也可以在一个源文件中定义这个全局变量,在头文件中用...
  • 全局变量局部变量静态全局变量、静态局部变量的区别   转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 ...
  • C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register)   局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参...
  • C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为...当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全...
  • 不同的函数,可以定义相同的名字的局部变量,但是各用个的互不影响;局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是他的作用 全局变量:如果一个变量,既能在一个函数中使用,也能在其他...
  •  在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量.  1.主函数main中定义的变量也只在主函数中有效,而...
  • 无论是以类为基础的面相对象编程,还是单纯函数内部变量的定义,变量的作用域始终是Python学习中一个必须理解掌握的环节,下面我们从局部变量和全局变量开始全面解析Python中变量的作用域,需要的朋友可以参考下 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 153,932
精华内容 61,572
关键字:

局部变量和全局变量可以定义相同吗