3.9. 变量的作用域

使用global 语句可以在函数体内修改 全局变量的值

1.内置作用域:python事先定义的
2.全局作用域:整个程序都可以使用的
3.局部作用局:某个函数内部范围

3.9.1. global 变量修改 局部->全局

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/9/6 15:54
# filename: example01.py
num = 100
print('函数调用前num的值为:{}'.format(num))


def func_glo_l():
    global num
    num = 200
    print("函数体中num的值为{}".format(num))




func_glo_l()
print("函数调用结束后num的值为{}".format(num))

输出结果:

"""
函数调用前num的值为:100
函数体中num的值为200
函数调用结束后num的值为200
"""

3.9.2. local()和global()函数的使用

#!/usr/bin/env python
#-*- coding:utf8 -*-
Var1_name = "hujianli_Var1"
def change_local():
    Var1_name = "hujianli_local_Var1"
    #打印局部命名空间的字典
    print("locals:",locals())

print(Var1_name)

#打印全局命名空间的字典
change_local()
print("global: ", globals())

locals():    #打印局部命名空间的字典

globals()    #打印全局命名空间的字典

代码示例1

#!/usr/bin/env python
#-*- coding:utf8 -*-
def fun_demo():
    '''
    局部变量
    :return:
    '''
    message = '唯有在被追赶的时候,你才能真正的奔跑。'
    print('局部变量message=',message)

fun_demo()  #调用函数
#print('局部变量message=',message)      #报错,函数体外,变量不生效
print()

#全局变量
message = '唯有在被追赶的时候,你才能真正的奔跑。'
def fun_demo():
    '''
    局部变量
    :return:
    '''
   # message = '唯有在被追赶的时候,你才能真正的奔跑。'
    print('函数体内:全局变量message=', message)


fun_demo()
print("函数体外,全局变量message=",message)
print()
print(" global 来修改全局变量 ".center(100,"*"))


## global可以使函数内的变量修改函数外的变量
message = '唯有在被追赶的时候,你才能真正的奔跑。'
def fun_demo():
    '''
    局部变量
    :return:
    '''
    global message
    message = '失望之酒,希望之杯.....'
    print('函数体内:全局变量message=', message)

fun_demo()
print("函数体外:全局变量message=",message)


print()
print(" 模拟松树做梦 ".center(100,"*"))
pinetree = '我是一棵松树' #全局变量(松树)
def fun_christmastree():    #定义一个函数
    '''
    功能;一个梦,无返回值
    :return:
    '''
    pinetree = '挂上彩灯、礼物....我编程一颗圣诞树@~@\n' #定义一个局部变量
    print(pinetree)
#函数体外
print('\n下雪了.....\n')
print("="*15, '开始做梦.....', '='*15)
fun_christmastree()  #调用函数
print("="*15, '梦醒了.....', '='*15)

pinetree = '我身上落满雪花, ' + pinetree + '-_-'
print(pinetree)

代码示例2

def func_test():
    a = 0
    a +=3
    print("局部作用域为 %s " % a)

a = "hujianli"
print("全局作用域为{}".format(a))
func_test()
print("全局作用域为{}".format(a))


print("".center(100,"*"))
#使用global可以让局部作用域修改到全局
def function_test():
    global name
    name = "hujianli_neibu "
    name += "global test"

name = "external"
print("全局作用域为{}".format(name))
function_test()
print("全局作用域为{}".format(name))

#局部作用域可以引用全局作用域,但是不能修改
a = "hujianli"
def test():
    print(a)

test()

a = "test"
def test2():
    print(a)
    a = "hu"   #当在这里修改的时候会报错
test2()
# 变量作用域


#!/usr/bin/env python
#-*- coding:utf8 -*-
x=10
def func(x):
    print("函数内x的值为: {}".format(x))
func(100)

print("函数外x的值为: ", x)



print("-"*100)

y = 50
def func(y):
    print("y等于",y)
    y = 2
    print("局部变量y变为",y)

func(y)
print("y一直是", y)

global 局部变量提升为全局变量

print("".center(100,"-"))
num=100
print("函数调用前num的值为:",num)
def func():
    #函数中将某个变量定义为全局变量,在需要被定义的变量前加一个关键字global
    global num
    num =200
    print("函数体中num的值为: ",num)

func()
print("函数调用结束后num的值为:",num)

print("*"*100)
n= 200

print("函数调用前的值为:",n)
def func2():
    global n
    n=400
    n+=100
    print("函数中n的值为: ",n)

func2()
print("函数调用完毕之后n的值为:",n)

局部函数

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/5/10 16:23
# filename: 局部函数.py

def get_math_func(type, nn):
    def square(n):
        return n * n

    def cube(n):
        return n * n * n

    def factorial(n):
        result = 1
        for index in range(2, n + 1):
            result *= index
        return result

    if type == "square":
        return square(nn)
    elif type == "cube":
        return cube(nn)
    else:
        return factorial(nn)


print(get_math_func("square", 3))
print(get_math_func("cube", 3))
print(get_math_func("", 3))

内部函数的局部变量互访 nonlocal关键字

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/5/10 16:29
# filename: 内部函数的局部变量互访.py

def foo():
    # 局部变量

    name = "唐三藏"

    def bar():
        nonlocal name
        print(name)
        name = "孙悟空"
        print(name)

    bar()


foo()

输出信息:

唐三藏
孙悟空