Python 名称空间与作用域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 名称空间与作用域相关的知识,希望对你有一定的参考价值。

名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方

一、名称空间又分为:

  内置名称空间:在python解释器启动时产生,存放一些python内置的名字

  全局名称空间:在执行文件时产生,存放文件级别定义的名字

  局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间
  用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束后失效

二、加载顺序

  加载顺序:内置--->全局--->局部

x=1
def func():#全局
    y=2
    def f1():pass#局部
    print


import os #内置

class Foo:
    pass

if x==1:z=3

del x

 

三、名字的查找顺序

  局部->全局->内置

# max=1
def foo():
    max=2
    # print(max)

foo()
print(max)




x=0
def f1():
    x=1
    def f2():
        x=2
        def f3():
            x=3
            print(x)
        f3()
    f2()
    print(=f1========,x)


f1()




def func1():
    print(from func1)

def func1():
    print(=====?>)

func1()

x=1
x=10
print(x)

四、作用域

  定义:作用的范围

一、分为

全局作用域:全局存活,全局有效:可以用globals()查看

max=1111111
def f1():
    def f2():
        def f3():
            def f4():
                # print(x)
                print(max)
            f4()
        f3()
    f2()


f1()

局部作用域:临时存活,局部有效可以用locals()查看

def f1():
    x=1
    y=2
    def f2():pass
    # print(locals())
    print(globals())

f1()
print(locals() is globals())
print(locals())

print(dir(globals()[__builtins__]))

二、改变全局变量

1、可以用global在局部改变全局变量

声明全局变量,如果在局部要对全局变量修改,需要在局部也要先声明该全局变量:

gcount = 0
def global_test():
    global  gcount
    gcount+=1
    print (gcount)
global_test()

如果在函数中声明 gcount 是全局变量,即可对其进行修改。 正确输出 1 

2、可变变量可以不需要global在函数内进行修改

l=[]
def f2():
    l.append(f2)

f2()
print(l)

3、、nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量

x=0
def f1():
    # x=1
    def f2():
        # x=2
        def f3():
           # global x
           nonlocal x  #找函数外一层的去找一直找到为止
           x=3
        f3()
        # print(x)
    f2()
    print(x)
f1()
print(x)

三、作用域关系

在函数定义时就已经固定于调用位置无关,在调用函数时,必须回到函数原来定义的位置去找作用域关系

x=1

def  f1():
    def f2():
        print(x)
    return f2
# func=f1()
# print(func)
# x=10000000
# func()
# x=10000000



def foo(func):
    x=300000000
    func() #f2()
x=10000000000000000000000



foo(f1()) #这里会找f1(),但会在定义f1的作用域去找x进行打印
# x=100000000

 

 

 

 

 


以上是关于Python 名称空间与作用域的主要内容,如果未能解决你的问题,请参考以下文章

python 函数的名称空间及作用域

python 14 名称空间与作用域

Python 名称空间与作用域

python名称空间与作用域

python基础名称空间与作用域

Python名称空间与作用域