1. 命名空间
Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。因此,我们无法从外部命名空间访问内部命名空间的对象!
# var1 是全局名称
var1 = 5
def some_func():
# var2 是局部名称
var2 = 6
def some_inner_func():
# var3 是内嵌的局部名称
var3 = 7
2. 作用域
3. 全局变量和局部变量
#!/usr/bin/python3
total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
#返回2个参数的和."
total = arg1 + arg2 # total在这里是局部变量.
print ("函数内是局部变量 : ", total)
return total
#调用sum函数
sum( 10, 20 )
print ("函数外是全局变量 : ", total)
###########################
# 执行结果如下:
函数内是局部变量 : 30
函数外是全局变量 : 0
全局变量在内部作用域中的修改:
当内部作用域想修改外部作用域的变量时,就要用到global
和nonlocal
关键字
(1)global
#!/usr/bin/python3
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num)
num = 123
print(num)
fun1()
print(num)
######################
# 执行结果如下:
1
123
123
nonlocal
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字
#!/usr/bin/python3
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
########################
# 执行结果如下:
100
100
传参修改
#!/usr/bin/python3
a = 10
def test(a):
a = a + 1
print(a)
test(a)
#################
# 执行结果如下
11
注意,这里涉及到Python的传参机制,具体可以参考这篇文章:传送门
Python有两种传参机制:
- 值传递
- 引用传递,如果实际参数的数据类型是可变对象(列表、字典),则函数参数的传递方式将采用引用传递方式。需要注意的是,引用传递方式的底层实现,采用的依然还是值传递的方式。
def swap(dw):
# 下面代码实现dw的a、b两个元素的值交换
dw['a'], dw['b'] = dw['b'], dw['a']
print("swap函数里,a元素的值是",\
dw['a'], ";b元素的值是", dw['b'])
dw = {'a': 6, 'b': 9}
swap(dw)
print("交换结束后,a元素的值是",\
dw['a'], ";b元素的值是", dw['b'])
##########################################
# 执行结果:
swap函数里,a元素的值是 9 ;b元素的值是 6
交换结束后,a元素的值是 9 ;b元素的值是 6
参考: