python的作用域

112 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

大家好,我是木大木大,因为疫情和环境原因啊,在家开始了自学python的路子,从此深坑加一人。后面我会每天持续更新一些学习python的过程,当然一开始就是一些基础啦,希望大家多多支持,莫嫌弃啦~

作用域

1.1 作用域简介

作用

域——》产生作用的区域

程序中指的是变量生效的区域

y = 2  #
def fn():
    x=1
    print("函数内部y = ",y)
fn()
print("函数外部y = ",y)

1.2 全局作用域

全局作用域的生命周期:全局作用域在程序执行时创建,在程序执行结束时销毁

所有函数以外的都是全局作用域
只要代码不是在函数里面的都是全局作用域
在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问
y = 2  # y是全局变量
def fn():
    x=1
    print("函数内部y = ",y)
fn()
print("函数外部y = ",y)

1.3 函数作用域(局部作用域)

生命周期:在函数调用时创建,在调用结束时销毁
函数每次调用的时候会产生一个新的函数作用域
def fn():
    a=10
    print("a",a)
fn()
fn()
fn()

def fn():
    a=10
    print("内部a=",a)
print("外部a=",a)  # 报错,访问不到函数内部a
def fn1():
    a = 30
    def fn2():
        print(a)  # 可以从里往外看
    fn2()
fn1()

def fn1():
    def fn2():
        a = 10
    print(a)  # 不能从外往里看
fn1()
# 使用变量的时候,会优先在当前作用域中寻找该变量,如果有就使用,没有则继续往上一级作用域寻找,如果全局作用域都没有就会报错
def fn1():
    a = 20
    def fn2():
        a = 10
        print(a)
    fn2()
fn1()
a = 1
def fn():
    a = 2
    print("内部a = ",a)
fn()
print("外部a = ",a)
内部a =  2
外部a =  1

------global 声明变量为全局变量

a = 1
def fn():
    global a
    a = 2
    print("内部a = ",a)
fn()
print("外部a = ",a)

内部a =  2
外部a =  2
总结:
1.基本就是 里面能看到外面,但是外面看不到里面
2.如果局部修改全局变量可以加上一个 global关键字声明一下
由内往外可以访问,由外往内是访问不了的

2.1 命名空间

指的是变量存储的位置,每一个变量都需要存储到指定的命名空间中

locals():获取当前作用域的命名空间,返回一个字典

{'__name__': '__main__', '__doc__': '\n1.写函数,判断用户传入的对象长度是否大于5\n\n\n2.写函数,检查传入列表的长度[1,2,3,4,5],如果长度大于2,那么仅仅保留前两个长度的内容,并返回保留的内容\n\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001B1BCC02910>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/小川/study/pythonproject/python68期_Text/day10/作用域与命名空间.py', '__cached__': None}
a = 1
def fn():
    pass
print(locals().keys())

dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'a', 'fn'])
a = 1
def fn():
    b = 1
    print(locals())  # {'b': 1}
fn()
a = 1
def fn():
    global b
    b = 1
    print(locals())  # global把b声明给了全局作用域 {}
fn()

a = 1
print(locals()['a'])
print(a)

locals()['b'] = 10
print(locals())
global ——》全局
nonlocal——》局部  内嵌函数中使用
用来在函数或其他作用域中使用外层(非全局)变量

def f1():
    a = 1
    def f2():
        a = 2
        print("内部a=",a)
    f2()
    print("外部a=",a)
f1()

内部a= 2
外部a= 1

def f1():
    a = 1
    def f2():
        nonlocal a
        a = 2
        print("内部a=",a)
    f2()
    print("外部a=",a)
f1()

内部a= 2
外部a= 2
全局 = 大方的人——》我的东西你们都可以用
局部 = 小气的人——》我的东西只有我能用

2.2 函数的高级用法

2.2.1 函数可以被引用(可以赋值)

def fn():
    print("我是fn")
f = fn
print(f,fn) # <function fn at 0x000002160DAF73A0> <function fn at 0x000002160DAF73A0>
fn()  # 我是fn
f()   # 我是fn

2.2.2 函数可以作为参数传入另一个函数

def fn():
    print("我是fn")
def fn2(x):  # x——》fn
    print(x)  # <function fn at 0x000002AAB84573A0>
    x()  # 我是fn
fn2(fn)

今天的内容就到这里啦,感谢观看喔~