Python中局部变量local、全局变量global、非局部变量nonlocal和嵌套函数局部变量如何区分?

2026-06-10 05:492阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1089个文字,预计阅读时间需要5分钟。

Python中局部变量local、全局变量global、非局部变量nonlocal和嵌套函数局部变量如何区分?

目录

一、作用域

二、局部作用域

Python中局部变量local、全局变量global、非局部变量nonlocal和嵌套函数局部变量如何区分?

三、全局作用域

四、非局部作用域

1.nonlocal:通常用于闭包函数中,nonlocal声明的变量在上级局部作用域内。


目录

​​一、作用域​​

​​二、局部作用域​​

​​三、全局作用域​​

​​四、nonlocal作用域​​

​​1 、nonlocal 一般是用在闭包函数中, nonlocal声明的变量在上级局部作用域内,而不是全局定义​​

​​2、如果在它声明的变量在上级局部中不存在,则会报错​​

​​3、使用nonlocal​​

​​4、就近原则​​

​​5、函数执行顺序​​

​​6、循环、判断代码块中作用域问题​​


一、作用域

Local 局部作用域
Enclosing 嵌套作用域
nonlocal 只作用于嵌套作用域,而且只是作用在函数里面
global 全局作用域
Built-in 内置作用域

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

变量作用域:

在Python程序中声明、改变、查找变量名时,都是在一个保存变量名的命名空间中进行中,此命名空间亦称为变量的作用域。python的作用域是静态的,在代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。

一般在函数体外定义的变量成为全局变量、在函数内部定义的变量称为局部变量。

全局变量所有作用域都可用,局部变量只能在本函数可用。

变量的使用顺序是,局部变量>全局变量,也就是说:优先使用局部变量。

那么问题来了,如果想在函数内使用全局变量,或改变全局变量的值,应该怎么做呢?

global关键字 出现了:

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

global关键字的作用:声明变量var是全局的

二、局部作用域

局部变量的定义无需使用关键字,定义变量时默认就是局部变量

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

def dummy():
i = 0
c = 100
print(i)
i += 1
print(c)

三、全局作用域

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

def dummy():
i = 0
global c
c = 100
print(i)
i += 1


print(c)

四、nonlocal作用域

1 、nonlocal 一般是用在闭包函数中, nonlocal声明的变量在上级局部作用域内,而不是全局定义

i = 0
n = 0


def dummy1():
i = 1
print(i)

def dummy2():
i = 2

dummy2()
print(i)


dummy1()
print(i)

==== 输出结果:

2、如果在它声明的变量在上级局部中不存在,则会报错

3、使用nonlocal

i = 0


def dummy1():
i = 1
print(i)

def dummy2():
nonlocal i # 非局部的,只适用于闭包内部
i = 2

dummy2()
print(i)


dummy1()
print(i)

4、就近原则

b = 1111


def func5():
b = 5
print('l29', b)

def func6():
b = 6
print('l33', b) # 这里的b从内到外就近查找

func6()
print('l36', b)


func5()


==== 输出结果:

5、函数执行顺序

虽然这样没有报错,但是运行时会报错

a = 123


def func1():
print(a)
print(b)


func1() # 不能打印b
b = 456
func1() # 可以打印b

==== 输出结果: 除非第32行调用函数func1放在33行之后才能不报错

6、循环、判断代码块中作用域问题

循环代码块中没有作用域这样的情况

if True:
a = 100
print(a)

for i in range(1, 5):
print(i)
print(i)

==== 输出结果:

本文共计1089个文字,预计阅读时间需要5分钟。

Python中局部变量local、全局变量global、非局部变量nonlocal和嵌套函数局部变量如何区分?

目录

一、作用域

二、局部作用域

Python中局部变量local、全局变量global、非局部变量nonlocal和嵌套函数局部变量如何区分?

三、全局作用域

四、非局部作用域

1.nonlocal:通常用于闭包函数中,nonlocal声明的变量在上级局部作用域内。


目录

​​一、作用域​​

​​二、局部作用域​​

​​三、全局作用域​​

​​四、nonlocal作用域​​

​​1 、nonlocal 一般是用在闭包函数中, nonlocal声明的变量在上级局部作用域内,而不是全局定义​​

​​2、如果在它声明的变量在上级局部中不存在,则会报错​​

​​3、使用nonlocal​​

​​4、就近原则​​

​​5、函数执行顺序​​

​​6、循环、判断代码块中作用域问题​​


一、作用域

Local 局部作用域
Enclosing 嵌套作用域
nonlocal 只作用于嵌套作用域,而且只是作用在函数里面
global 全局作用域
Built-in 内置作用域

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

变量作用域:

在Python程序中声明、改变、查找变量名时,都是在一个保存变量名的命名空间中进行中,此命名空间亦称为变量的作用域。python的作用域是静态的,在代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。

一般在函数体外定义的变量成为全局变量、在函数内部定义的变量称为局部变量。

全局变量所有作用域都可用,局部变量只能在本函数可用。

变量的使用顺序是,局部变量>全局变量,也就是说:优先使用局部变量。

那么问题来了,如果想在函数内使用全局变量,或改变全局变量的值,应该怎么做呢?

global关键字 出现了:

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

global关键字的作用:声明变量var是全局的

二、局部作用域

局部变量的定义无需使用关键字,定义变量时默认就是局部变量

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

def dummy():
i = 0
c = 100
print(i)
i += 1
print(c)

三、全局作用域

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

def dummy():
i = 0
global c
c = 100
print(i)
i += 1


print(c)

四、nonlocal作用域

1 、nonlocal 一般是用在闭包函数中, nonlocal声明的变量在上级局部作用域内,而不是全局定义

i = 0
n = 0


def dummy1():
i = 1
print(i)

def dummy2():
i = 2

dummy2()
print(i)


dummy1()
print(i)

==== 输出结果:

2、如果在它声明的变量在上级局部中不存在,则会报错

3、使用nonlocal

i = 0


def dummy1():
i = 1
print(i)

def dummy2():
nonlocal i # 非局部的,只适用于闭包内部
i = 2

dummy2()
print(i)


dummy1()
print(i)

4、就近原则

b = 1111


def func5():
b = 5
print('l29', b)

def func6():
b = 6
print('l33', b) # 这里的b从内到外就近查找

func6()
print('l36', b)


func5()


==== 输出结果:

5、函数执行顺序

虽然这样没有报错,但是运行时会报错

a = 123


def func1():
print(a)
print(b)


func1() # 不能打印b
b = 456
func1() # 可以打印b

==== 输出结果: 除非第32行调用函数func1放在33行之后才能不报错

6、循环、判断代码块中作用域问题

循环代码块中没有作用域这样的情况

if True:
a = 100
print(a)

for i in range(1, 5):
print(i)
print(i)

==== 输出结果: