python函数2_闭包和装饰器

小菜鸟的代码世界 2020-02-20

变量的范围(局部/全局)

  • 局部变量
    • 在函数内部声明的变量
    • 在函数体外部无法获取
  • 全局变量
    • 在函数外部声明的变量
    • 所有函数都可以访问

在函数内,局部变量和全局变量同名,优先使用局部变量

name = '月月'
def fun2():
    name = '小月月'
    name += '会弹吉他'
    print(name)

fun2()
小月月会弹吉他

当在函数体内,尝试更改全局变量会报错

name = '月月'
def fun2():
    print(name)
    name += '会弹吉他'

fun2()

当需要在函数体内修改全局变量时,需要加global

只是获取不需要加

name = '月月'
def fun2():
    global name
    name += '会弹吉他'
    print(name)
fun2()
print(name)
月月会弹吉他
月月会弹吉他

当在函数中要修改的全局变量是可变类型的,如列表,则不需要添加global关键字

list1 = ['python','php','go']
def fun2():
    list1.append('java')
fun2()
print(list1)
['python', 'php', 'go', 'java']

内部函数

可以访问外部函数的变量

a = 10
def func1():
    b = 20
    def func2():
        print(a,b)
    func2()
func1()
10 20

内部函数可以修改外部函数的可变类型的变量比如:list

list1 = ['python','php','go']
def func1():
    list2 = ['html','css']
    def func2():
        list1.append('java')
        list2.append('javascript')
        print(list1,list2,sep='\n')
    func2()
func1()
['python', 'php', 'go', 'java']
['html', 'css', 'javascript']

内部函数修改全局的不可变变量时,需要在内部函数声明global 变量名

a = 10
def func1():
    b = 20
    def func2():
        global a
        a += b
        print(a,b)
    func2()
func1()

内部函数修改外部函数的不可变变量时,需要在内部函数中声明,nonlocal 变量名

a = 10
def func1():
    b = 20
    def func2():
        nonlocal b
        b += a
        print(a,b)
    func2()
func1()

4.1, locals(),可以看到当前函数中声明的变量有哪些,以字典的形式输出

a = 10
def func1():
    b = 20
    def func2():
        nonlocal b
        b += a
        print(locals())
    func2()
    print(locals())
func1()
{'b': 30}
{'func2': <function func1.<locals>.func2 at 0x000001BF232F4730>, 'b': 30}

globals(),查看全局变量有那些,以字典的形式输出(会有一些系统中的键值对)

a = 10
def func1():
    b = 20
    def func2():
        nonlocal b
        b += a
        print(globals())
    func2()
func1()

相关推荐