Python学习笔记三

一、Python命名空间:

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

一般有三种命名空间:内置名称、全局名称、局部名称

命名空间查找顺序:局部命名空间à全局命名空间à内置命名空间

命名空间的生命周期:命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

var1=5     #全局名称
def some_func():
    var2=6    #局部名称
    def some_inner_func():
        var3=7    #内嵌的局部名称

二、作用域

作用域就是一个 Python 程序可以直接访问命名空间的正文区域。

在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种:(搜索顺序) L --> E --> G --> B

g_count=1     #全局作用域
def outer():
    o_count=3     #闭包函数外的函数中
    def inner():
        i_count=5     #内置作用域

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域 。

也就是说这些语句内定义的变量,外部也可以访问 。

# msg 变量定义在 if 语句块中,但外部还是可以访问的。
if 1:
    msg='我是圆滚滚!'

msg

#如果将 msg 定义在函数中,则它就是局部变量,外部不能访问。
def test():
    inner_msg='我是圆滚滚!'    #局部变量,只有在函数内可以使用

inner_msg          #报错

三、全局变量和局部变量:

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

total=0    # 这是一个全局变量
def sum(args1,args2):
    total=args1+args2
    print("函数内是局部变量:",total)

#调用sum函数
sum(10,20)
print("函数外是全局变量:",total)

四、当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了:

# 修改全局变量 num
num=1
def func1():
    global num     #global 关键字声明
    print(num)
    num=123
    print(num)

func1()
print(num)


#修改嵌套作用域中的变量
def outer():
    num=10
    def inner():
        nonlocal num     # nonlocal关键字声明
        num=123
        print(num)
    inner()
    print(num)
outer()
#下面代码会报错
a=11
def test():
    a=a+1
    print(a)
test()


#修改如下:
a=11
def test(a):
    a=a+1
    print(a)
test(a)
posted @ 2019-12-27 16:08  yl_du  阅读(142)  评论(0)    收藏  举报