python3的local, global, nonlocal简析

python3的local, global, nonlocal简析python3 变量作用域及 global nonlocal 的用法在 Python 程序中声明 改变 查找变量名时 都是在一个保存变量名的命名空间中进行中 此命名空间亦称为变量的作用域 python 的作用域是静态的 在代码中变量名被赋值的位置决定了该变量能被访问的范围 即 Python 变量的作用域由变量所在源代码中的位置决定 变量作用域之 LENGBL Local 局部作用域 E

python3:变量作用域及global,nonlocal的用法

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

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

def testlocal():     x = 123 # x即为局部变量 print(x)

以上代码运行就会报NameError, 因为x是个局部变量,在函数外要print(x), 按照上面python引用变量的顺序,是找不了x变量的,故为报错. 

NameError: name 'x' is not defined

1.1 再举一例:

x = 123 def testlocal():     print(x) testlocal()

以上代码运行结果为123, 因为按照上面python引用变量的顺序,是找不到x变量的,故会向外层作用域找,就会找到x=123

1.2 如果将代码改为:

x = 123 def testlocal():     print(x)     x = 100 testlocal()

这时以上代码运行就会报错. 

UnboundLocalError: local variable 'x' referenced before assignment

2. G = global    全局作用域
全局作用域的变量怎么用呢?
先看实例:




x = 123 def testGlobal():     print(x)     x = 100      testGlobal()

这就是上面1.2的实例,会报错,如果将其为:

x = 123 def testGlobal():     global x     print(x)     x = 100      testGlobal()

试试看,结果运行结果为123, 是不会报错的,自已体会一下吧. 

3. nonlocal的用法
这个一般是用在闭包函数里. 但是一定要认识到, nonlocal声明的变量在上级局部作用域内,而不是全局定义, 如果在它声明的变量在上级局部中不存在,则会报错. 实例如下:

x = 123 def outer():     x = 100     def inter():         x = 200     inter()     print(x)      func()

运行的结果为100, 那如果要求inter中对x的修改是有效的,必须加上关键字nonlocal

x = 123 def outer():     x = 100     def inter():         nonlocal x         x = 200     inter()     print(x)      func()

运行的结果为200, 符合预期.

现将inter的上级局部变量x去掉,则会报错

x = 123 def outer():     # x = 100     def inter():         nonlocal x         x = 200     inter()     print(x)      func()

4. 其它.
python变量的作用域只在作用域内有效,需要注意的是,在if-elif-else, for-in, while, try-except-finally这些关键字中并不会产生特定的作用域,如下:

#!/user/bin/python3 #-*- coding:utf-8 -*- for i in range(10):     i = i + 1 print(i) >>>10

运行结果并不会报错,会输入i, 这里的i就是一个全局变量,这是python的一个特点,如果在C/java中这种写法就会报错,会报变量i会声明.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223364.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:15
下一篇 2026年3月17日 下午2:15


相关推荐

  • QStringList中begin()、end()与first()、last()

    QStringList中begin()、end()与first()、last()QStringList的begin:返回的是迭代器指向第一项iteratorQStringList的end:返回的是迭代器指向最后一项iteratorQStringList的last:返回列表第一项的引用,前提该表不为空QStringList的last:返回列表最后一项的引用…

    2022年5月10日
    86
  • 自定义PMD检测的类型集合(详解)

    自定义PMD检测的类型集合(详解)自定义 PMD 检测的类型集合 PMD 所能检测的类型 八大种 使用方法使用 xml 配置文件配置多条规则 1 在 resources 目录下写个配置文件 settings xml 命名无要求 2 configuratio setRuleSets settings xml 引用规则集使用 setRuleSets 配置多条规则 PMD 所能检测的类型 八大种 官网链接 点这里大概共有 319 条小规则 不算舍弃的规则 源码包中检测 Java 的规则所在的位置 pmd src 6 32 0 pmd java src main

    2026年3月19日
    2
  • python读取txt文件内容(python怎么读取excel)

    python读取txt文件的方法:首先打开文件,代码为【f=open(‘/tmp/test.txt’)】;然后进行读取,代码为【本教程操作环境:windows7系统、python3.9版,该方法适用于所有品牌电脑。python读取txt文件的方法:一、文件的打开和创建>>>f=open(‘/tmp/test.txt’)>>>f.read()’hell…

    2022年4月14日
    56
  • k8s 开源_jdk源码剖析手册

    k8s 开源_jdk源码剖析手册createfunc main() { #随机数 rand.Seed(time.Now().UnixNano()) #创建一个新的命令行对象 command := cmd.NewDefaultKubectlCommand() #日志 logs.InitLogs() defer logs.FlushLogs() #真正执行的命令行 if err := command.Execute(); err != nil { os.Exit(1) }}# NewDefaultKubectl

    2022年8月11日
    6
  • freemarker错误九

    freemarker错误九

    2022年1月3日
    49
  • eclipse如何使用svn_eclipse使用svn提交代码步骤

    eclipse如何使用svn_eclipse使用svn提交代码步骤Eclipse,Idea使用SVNEclipse使用SVNEclipse中svn插件安装eclipsemarket在线安装eclipseInstallNewSoftware手动在线安装下载插件安装Eclipse日常使用创建资源库位置清除缓存的用户名密码Eclipse工程中忽略文件Eclipse分享项目工程切换svn分支节点常规操作svnupgradesvn:E155036Eclipse使用SVNEclipse中svn插件安装eclipse对svn的支持力度较小,在比较高的版本中也没有

    2026年4月14日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号