• python变量作用域


    在程序中定于一个变量时,这个变量时有作用范围的,变量的作用范围被称为它的作用域,根据定义变量的位置,变量分为两种:

      局部变量:在函数中定义的变量,包括参数,都被称为局部变量。

      全局变量:在函数外面,全局范围内定义的变量,被称为全局变量。

    每个函数在执行时,系统都会为该函数分配一块‘临时内存空间’,所有的局部变量都被保存在这块临时内存空间内。但函数执行完成后,这块内存空间就被释放了,这些局部变量也就消失了。

    全局变量意味着他们可以在所有函数内被访问。

    不管实在函数的局部范围还是全局范围内,都存在多个变量,每个变量持有该变量的值,这些变量和他们的值就想一个看不见的字典,其中变量名字就是key,变量值就是value。

    实际上python提供了如下三个工具函数来获取指定范围内的‘变量词典’

      globals():该函数返回全局范围内所有变量组成的‘变量字典’

      local():该函数返回当前局部范围内所有变量组成的‘变量字典’

      vars(object):获取在只能法定对象范围内所有变量组成的‘变量字典’,如果不传入object参数,vars()和locals()的作用完全相同。

    locals()总是获取当前局部范围内所有变量组成的‘变量字典’,因此,如果在全局范围内调用locals()函数,同样获取全局范围内所有变量组成的‘变量字典’,globals()无论在哪执行总是获取全局范围内所有变量组成的‘变量字典’

    >>> def test():
    age=20
    print(age)
    print(locals())
    print(locals()['age'])
    locals()['age']=12
    print('现在的age:',age)
    globals()['x']=55


    >>> test()
    20
    {'age': 20}
    20
    现在的age: 20
    >>> x
    55
    >>> x=5
    >>> x
    5
    >>> test()
    20
    {'age': 20}
    20
    现在的age: 20
    >>> x
    55

    全局变量默认可以在所有函数内被访问,但是如果在函数中定义了与全局变量同名的变量,此时就会发生局部变量遮蔽(hide)全局变量的情形。

    >>> name='charlie'
    >>> def test():
    print(name)


    >>> test()
    charlie
    >>> print(name)
    charlie
    >>> def test():
    print(name)
    name='bob' #在这里再定义一个name,name后面会出错


    >>> test()
    Traceback (most recent call last):
    File "<pyshell#103>", line 1, in <module>
    test()
    File "<pyshell#102>", line 2, in test
    print(name)
    UnboundLocalError: local variable 'name' referenced before assignment #在未被定义就被提及
    >>> print(name)
    charlie

     该错误提示test()中的print(name)的那么还未定义。这正是程序中name='bob'导致的。

    python规定在函数内对不存在的变量赋值时,默认就是重新定义新的局部变量。因此这行代码重新定义了那么的局部变量,这样name全局变量就被遮蔽了。

     如何便面这种情况?

    >>> name='charlie'
    >>> def test():
    #通过globals()函数访问name全局变量
    print(globals()['name'])
    name='bob'


    >>> test()
    charlie
    >>> print(name)
    charlie
    >>> def test():
    #通过globals()函数访问name全局变量
    print(globals()['name'])
    name='bob'
    print(name)


    >>> test()
    charlie
    bob

    或者

    >>> name='charlie'
    >>> def test():
    global name  #全局声明,声明name是全局变量,后面的赋值语句不会重新定义局部变量
    print(name)
    name='bob'
    print(name)


    >>> test()
    charlie
    bob
    >>> name
    'bob'

  • 相关阅读:
    <contextparam>与<initparam>的区别与作用
    Eclipse中的条件断点
    通过ContentResolver调用系统URI实现的通讯录示例
    Spring中ApplicationContext加载机制和配置初始化
    Java常见笔试、面试题目深度剖析
    加载/WEBINF/applicationContext.xml的解决方法
    Spring ClassPathXmlApplicationContext和FileSystemXmlApplicationContext
    改变MyEclipse默认编码方式
    怎么把100多个EXCEL文件合并成一个
    1.Python简介
  • 原文地址:https://www.cnblogs.com/inuyashalove/p/12751586.html
Copyright © 2020-2023  润新知