4.4 Python3 进阶 - 变量作用域
>>返回主目录
源码
# 变量作用域
a_test_1 = 1 # 全局变量
def scope_demo():
# print(f'函数内初始a_test_1的值是:{a_test_1}')
a_test_1 = 2 # 局部变量
b_test_1 = 4 # 局部变量
b_test_1 = a_test_1 + b_test_1 # 修改局部变量的值
print(f'函数内a_test_1的值是:{a_test_1}, 函数内b_test_1的值是:{b_test_1}')
scope_demo()
print(f'函数外a_test_1的值是:{a_test_1}')
# print(f'函数外b_test_1的值是:{b_test_1}')
源码
# 外部嵌套函数(Enclosing) & 内建(Built-in)作用域
# 闭包函数
a_test_4 = 100
def outer_fun_4():
a_test_4 = 20
def inner_fun_1(): # 不是闭包函数
a_test_4 = 40
print(f'内函数1中a_test_4的值是:{a_test_4}')
def inner_fun_2(): # 闭包函数
print(f'内函数2中a_test_4的值是:{a_test_4}')
print('判断闭包2', inner_fun_2.__closure__)
inner_fun_2() # 调用内部函数
inner_fun_1() # 调用内部函数
print('判断闭包1', inner_fun_1.__closure__)
print(f'外函数4内a_test_4的值是:{a_test_4}')
outer_fun_4()
print(f'函数外a_test_4的值是:{a_test_4}')
# 判断闭包函数方法:函数名.__closure__ 在函数是闭包函数时,返回一个cell元素;不是闭包时,返回None
# print(inner_fun_2.__closure__ ) # 与调用该函数缩进相同,无法直接调用内部函数
源码
# 内建作用域
def outer_fun_5():
max = 10
def inner_fun_1():
max = 20
print(f'内函数1中a_test_4的值是:{max}') # 使用局部变量20
inner_fun_1()
outer_fun_5()
print(f'函数外max的值是:{max}') # 内建作用域
源码
# 变量作用域总结
v = 100 # 全局作用域
def outer_fun_6():
v = 200 # 外部嵌套函数作用域
print(f'访问外部函数的局部变量v:{v}')
def inner_fun():
# v = 300 # 局部作用域
max = 3
print(f'访问内部函数的局部变量v:{v}')
print(f'访问内部函数的局部变量max:{max}') # 内置模块的作用域可以在其余三个作用域重新创建
inner_fun()
outer_fun_6()
print(f'访问全局变量v:{v}')
print(f'访问内置函数作用域的变量max:{max}') # 内建作用域
源码
# 修改作用域变量:global和nonlocal
# global的使用,例如:
a_test_2 = 10 # 全局变量
def change_scope_demo():
global a_test_2 # 使用global关键字声明全局变量
a_test_2 = 2
print(f'修改后函数内a_test_2的值是:{a_test_2}')
change_scope_demo()
print(f'函数外a_test_2的值是:{a_test_2}')
# nonlocal的使用(适用嵌套函数内部,无法修改全局变量),例如:
a_test_3 = 100
def outer_fun():
# global a_test_3 # 如果在外函数内,声明了全局变量,那么使用nonlocal关键字声明内函数变量时,就无法找到外函数内的局部变量,会报错
a_test_3 = 20
def inner_fun_1():
nonlocal a_test_3
print(f'在内函数中a_test_3的值是:{a_test_3}')
a_test_3 = 10
print(f'修改后内函数a_test_3的值是:{a_test_3}')
inner_fun_1() # 调用内部函数
print(f'外函数内a_test_3的值是:{a_test_3}')
outer_fun()
print(f'函数外a_test_3的值是:{a_test_3}')
源码
# 作用域变量集合:globals()
# 全局变量
python_name = 'Python之路'
python_url = 'https://www.cnblogs.com/PortosHan/'
def learn_python():
# 局部变量
python_name = 'Python目录'
python_url = 'https://www.cnblogs.com/PortosHan/p/14449208.html'
def python_1():
python_name_1 = 'Python3基础-前言'
python_url_1 = 'https://www.cnblogs.com/PortosHan/p/14462299.html'
print('inside call:', globals()) # 内函数中调用
print('out-inside call:', globals()) # 外函数中调用
return python_1()
print('outside call:', globals()) # 函数外调用
learn_python()
源码
# 访问指定全局变量
print(f'访问python_name的值是:{globals()["python_name"]}')
print(f'访问python_name的值是:{globals().get("python_name")}')
# 修改全局变量中的值,全局变量会被修改
globals()["python_name"] = 'Learn Python'
print(f'全局变量python_name修改后的值是:{python_name}')
源码
# 变量作用域集合:locals()
# 全局变量
python_name = 'Python之路'
python_url = 'https://www.cnblogs.com/PortosHan/'
def learn_python():
# 局部变量
python_name = 'Python目录'
python_url = 'https://www.cnblogs.com/PortosHan/p/14449208.html'
# 修改局部变量中的值,不会被修改
locals()["python_name"] = 'Learn Python'
print(f'局部变量python_name修改后的值是:{python_name}')
def python_1():
python_name_1 = 'Python3基础-前言'
python_url_1 = 'https://www.cnblogs.com/PortosHan/p/14462299.html'
print('inside call:', locals()) # 内函数中调用
print('out-inside call:', locals()) # 外函数中调用
return python_1()
print('outside call:', locals()) # 函数外调用
learn_python()
源码
# 访问指定变量
print(f'访问python_name的值是:{locals()["python_name"]}')
print(f'访问python_name的值是:{locals().get("python_name")}')
# 修改全局变量中的值,可以被修改,同globals()
locals()["python_name"] = 'Learn Python'
print(f'全局变量python_name修改后的值是:{python_name}')
源码
# 变量作用域集合:vars()
# 全局变量
python_name = 'Python之路'
python_url = 'https://www.cnblogs.com/PortosHan/'
class LearnPython:
# 局部变量
python_name = 'Python目录'
python_url = 'https://www.cnblogs.com/PortosHan/p/14449208.html'
def python_1(self):
self.python_name_1 = 'Python3基础-前言' # self对象内属性
python_url_1 = 'https://www.cnblogs.com/PortosHan/p/14462299.html' # 局部变量
print('inside call1:', vars()) # 函数中调用
print('inside call2:', vars(LearnPython)) # 函数中调用
print('out-inside call:', vars()) # 类中调用
print('outside call1:', vars()) # 类外调用
print('outside call2:', vars(LearnPython)) # 类外调用
LearnPython().python_1() # 创建实例,调用函数
源码
# 访问指定object内的变量
print(f'访问python_name的值是:{vars(LearnPython)["python_name"]}')
print(f'访问python_name的值是:{vars(LearnPython).get("python_name")}')
# 修改指定object内局部变量中的值,不可变的映射类型(mappingproxy)无法修改,会报错
# vars(LearnPython)["python_name"] = 'Learn Python'
# 修改全局变量中的值,可以被修改,同globals()
vars()["python_name"] = 'Learn Python'
print(f'全局变量python_name修改后的值是:{python_name}')
>>返回主目录
作者: PortosHan
出处: https://www.cnblogs.com/PortosHan/
关于作者:专注于软件测试、测试开发等领域,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 原文链接 如有问题,可邮件(bhanzdan@163.com)咨询。