python中的关键字global和nonlocal

知识点:

global将一个变量变为全局变量

nonlocal改变最近的变量,又不是全局作用。

1.global

在python中,当引用一个变量的时候,对这个变量的搜索按找本地作用域(Local)、嵌套作用域(Encolosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。

m = 1    #全局
def fun1():
    m = 2    #嵌套
    def fun2():
        m = 3    #本地
    fun2()
fun1()

当在函数中给一个变量赋值的时候,python总是创建或者改变本地作用域的变量名,因此你无法在一个函数外调用函数内的变量,也无法在函数内改变一个函数外的变量。就像下面

#外层无法引用内层变量
def fun1():
    k = 10
fun1()
print(k)

结果:
Traceback (most recent call last):
  File "I:/untitled/cx/11月/11-17面向对象/1.属性.py", line 83, in <module>
    print(k)
NameError: name ‘k‘ is not defined

#内存无法改变外层变量
k = 100
def fun1():
    k = k + 50
fun1()
print(k)

#结果
Traceback (most recent call last):
...
UnboundLocalError: local variable ‘k‘ referenced before assignment

如果在函数中改变函数外的变量或者在函数外调用函数内的变量时,可以使用global。

global可以将一个变量变为全局变量。在内部改变或者在外部引用。

def fun1():
    global k
    k = 50
fun1()
print(k)

或者这样
k = 10
def fun1():
    global k
    k = 50
fun1()
print(k)

2.nonlocal

nonlocal可以在一个嵌套的函数中修改嵌套作用域中的变量,理论上是修改离它最近的变量,但不会改变全局。

#这是正常情况
def func3():
    n = 1
    def func4():
        n = 2
        def func5():
            n = 5
            print(n) #5
        func5()
        print(n)   #2
    func4()
    print(n)   #1
func3()

加入nonlocal之后

def func3():
    n = 1
    def func4():
        n = 2       #最近的n = 5
        def func5():
            nonlocal n
            n = 5
            print(n) #5
        func5()
        print(n)   #5
    func4()
    print(n)   #1
func3()

还可能这样:

def func3():
    n = 1  #这里最近n =5
    def func4():
        # n = 2
        def func5():
            nonlocal n
            n = 5
            print(n) #5
        func5()
        print(n)   #5   继承func3
    func4()
    print(n)   #5
func3()

不会改变全局

n =100
def func3():
    n = 1  #这里最近n =5
    def func4():
        def func5():
            nonlocal n
            n = 5
            print(n) #5
        func5()
        print(n)   #5   继承func3
    func4()
    print(n)   #5
func3()

#结果
5
5
5
100
时间: 2024-10-15 18:07:13

python中的关键字global和nonlocal的相关文章

函数的第二节课,动态传参,动态关键字参数,作用域,关键字global和nonlocal

今日内容总结: 一.函数参数--动态传参 动态参数必须是在位置参数后面,比如:def chi(a,b,*food): print("我要吃",a,b,food)chi("大米饭","小米饭","黄瓜","西红柿") 默认值参数必须是在最后位置,比如:def chi(a,b,*food,c="馒头"): print(a,b,food,c)chi("香蕉", "

Python迭代器和关键字 global ,nonlocal

1.关键字 global : 可以修改全局变量 可以在局部作用域声明一个全局变量,剪切 : 此时局部作用域没有该变量,全局作用域中有 name = 1 def func(): global name name += 1 print(globals()) func() print(name) print(globals()) nonlocal : 不能操作全局变量 可以对父级作用域的变量进行修改,并且在当前作用域创建(复制)一分此变量 # 这是复制 # def func(): # count =

python globals()和locals(),global和nonlocal,以及闭包

1. 命名空间和作用域 命名空间 1. 内置命名空间: python解释内部运行时的变量函数 2. 全局命名空间: 我们在py文件中直接声明出来的变量, 函数 3. 局部命名空间: 在函数内部声明的变量和函数 作用域: 1. 全局作用域: 内置 + 全局 2. 局部作用域: 局部 globals() 查看全局作用域中的名字 locals() 查看当前作用域中的名字 2. global和nonlocal global: 把全局变量拿到局部来用. nonlocal:把离他最近的一层的变量拿过来, 不

Python中的关键字

关键字 keyword 是编程语言中规定具有特殊用途的单词,在编程中不能使用和关键字相同的 标识符.函数名.类名.属性名.方法名. 在Python中可以通过keyword模块来查看具体关键字,代码如下: 1 import keyword #导入模块 2 print(keyword.kwlist) #输出kwlist列表

python中的关键字---1

变量命名规则: 1.变量由字母数字下划线组成2.变量不能以数字开头3.禁止使用python中关键字4.禁止使用中文和拼音5.变量名要区分大小写6.变量名要有意义7.推荐写法. 驼峰体. 大驼峰.AgeOfOldboy 小驼峰.ageOfOldboy 下划线.age_of_oldboy 字符串规则: 字符串拼接,字符串只能和字符串相加字符串不能减法字符串只能和数字相乘字符串不能进行相除 基础数据类型 int,整形,用于计算和比较str字符串,字符串只能和字符串相加,字符串只能和数字相乘bool布尔

python中的关键字---4(匿名/递归函数)

匿名函数 # 匿名函数 别称 : lambda表达式# 函数,没有名字# def wahaha(n):# return n**2# print(wahaha.__name__) # qqxing = lambda n : n**2# print(qqxing.__name__)# ret = qqxing(8)# print(ret) # f = lambda *args:sum(args)# ret = f(1,2,3,4,5)# print(ret) # 写匿名函数 : 接收两个参数,返回较

python中的关键字---7(re/序列化/Counter模块)

import re  正则 正则表达式 # 元字符 # \w 数字字母下划线 # \W 非数字字母下划线 # \d 数字 # \D 非数字 # \s 空白符(空格\制表符\换行符) # \S 非空白符 # \t 制表符 # \n 换行符 # \b 单词的边界 # . 除了换行符以外的所有 # ^ 开始 # $ 结尾 # [..] 字符组 # [^..] 非字符组 # | 或(包含关系中,长的在前面) # () 分组(在或的两端,在添加量词的时候,findall的时候优先要显示的) # (123\

python中的关键字---2(函数基础类)

函数基础 定义函数: def 函数名(): 缩进 函数体(代码块) 调用函数: 函数名 + () 小括号 执行顺序: def func(): 1 print('这大佬黑') 3 func()调用 2 函数的返回值: def func(): 1 print('这大佬黑') 3 return '今晚不溅不散' func()调用 2 返回一个参数的时候是它本身,返回多个就是元组形式显示 当函数体执行到return的时候就结束函数 不写return的时候 默认返回None 写了return不写返回值的时

python中super关键字的用法

class A: def __init__(self):    print "enter A"    print "leave A" class B(A): def __init__(self):    print "enter B"    A.__init__(self)   # old method    print "leave B" >>> b = B() enter B enter A leave