Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域

一、作用域

Local 局部作用域

Enclosing 嵌套作用域

nonlocal 只作用于嵌套作用域,而且只是作用在函数里面

global 全局作用域

Built-in 内置作用域

python变量的使用顺序:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量.

变量作用域:

在Python程序中声明、改变、查找变量名时,都是在一个保存变量名的命名空间中进行中,此命名空间亦称为变量的作用域。python的作用域是静态的,在代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。    一般在函数体外定义的变量成为全局变量、在函数内部定义的变量称为局部变量。    全局变量所有作用域都可用,局部变量只能在本函数可用。    变量的使用顺序是,局部变量>全局变量,也就是说:优先使用局部变量。

所以问题是,如果我想在函数中使用全局变量,或者更改全局变量的值,我应该怎么做?

[En]

So the question is, what should I do if I want to use a global variable within a function, or change the value of a global variable?

global关键字 出现了:

为了解决函数内使用全局变量的问题, python增加了global关键字,利用它的特性,可以指定变量的作用域。    global关键字的作用:声明变量var是全局的
二、局部作用域

局部变量的定义不需要使用关键字,定义变量时默认为局部变量。

[En]

The definition of local variables does not need to use keywords, and the default is local variables when defining variables.

在下列代码 c = 100 中c就是局部变量,c 是在函数内容定义的,在函数外是获取不到的

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
def dummy():    i = 0    c = 100    print(i)    i += 1print(c)
三、全局作用域

使用关键字global,要先用global关键字修饰,再赋值

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
def dummy():    i = 0    global c    c = 100    print(i)    i += 1  print(c)
四、nonlocal作用域
1 、nonlocal 一般是用在闭包函数中, nonlocal声明的变量在上级局部作用域内,而不是全局定义

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
i = 0n = 0  def dummy1():    i = 1    print(i)     def dummy2():        i = 2     dummy2()    print(i)  dummy1()print(i)

==== 输出结果:

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
2、 如果在它声明的变量在上级局部中不存在,则会报错

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
3、使用nonlocal

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
i = 0  def dummy1():    i = 1    print(i)     def dummy2():        nonlocal i  # 非局部的,只适用于闭包内部        i = 2     dummy2()    print(i)  dummy1()print(i)
五、就近原则
b = 1111  def func5():    b = 5    print('l29', b)     def func6():        b = 6        print('l33', b)  # 这里的b从内到外就近查找     func6()    print('l36', b)  func5()

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域

==== 输出结果:

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
六、函数执行顺序

尽管这不会报告错误,但它会在运行时报告错误

[En]

Although this does not report an error, it will report an error at run time

a = 123  def func1():    print(a)    print(b)  func1()  # 不能打印bb = 456func1()  # 可以打印b

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域

==== 输出结果:

除非第32行调用函数func1放在33行之后才能不报错

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域
七、循环、判断代码块中作用域问题

循环代码块中没有作用域

[En]

There is no scope in the loop code block

if True:    a = 100print(a) for i in range(1, 5):    print(i)print(i)

==== 输出结果:

Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域

Original: https://blog.51cto.com/u_15668438/5560941
Author: lanxiaofang
Title: Python 局部变量global,全局变量local ,非局部变量nonlocal ,Enclosing function locals作用域

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504325/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球