Contents
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()
输出信息:
唐三藏
孙悟空