在 Python 中,变量的作用域指的是变量可以被访问的范围。Python 中的变量作用域有两种:

  • 局部作用域:变量在函数函数内部的时候,只能在函数内部使用。这样的变量被称为局部变量。

    • 如果在函数内部定义了一个变量,那么该变量只能在函数内部使用,如果想要在函数外部访问该变量,需要使用return语句将其返回。
  • 全局作用域:变量在函数外部定义的时候,可以在任何地方访问。这样的变量被称为全局变量。
    • 如果你在函数外部定义了一个变量,那么该变量可以在任何地方访问,包括函数内部和外部。

global

如果你想在函数内部修改全局变量的值,可以使用global关键字。例如:

x = 10  # 全局变量
def foo():
"""需要注意的是,如果在内部定义了局部变量,那么在这之前访问该变量将会报错"""
x = 30
print("函数内部尝试修改全局变量x为", x) # 函数内部尝试修改全局变量x为 30
foo()
print("最终的全局变量x", x) # 最终的全局变量x 10
def foo1():
"""在这里,如果在global声明之前访问了x,那么x就会被定义为局部变量,那么再次声明global x 将会报错"""
global x
x = 20 # 修改全局变量
print("函数内部尝试使用global修改x为", x) # 函数内部尝试使用global修改x为 20
foo1()
print("最终的全局变量x为", x) # 最终的全局变量x为 20

在上面的代码中,我们使用global关键字在函数内部声明了x为全局变量。然后在函数内部修改了x的值。最后,在函数外部打印x的值,输出的结果为20。

需要注意的是,在使用global关键字之前,必须先在函数外部定义该全局变量。否则,Python 会将该变量视为局部变量,而不是全局变量。

此外,在函数内部不要滥用global关键字,应该尽可能地避免修改全局变量的值,以避免出现意外的错误。


nonlocal

nonloca用于在嵌套函数中使用变量,其中变量不应属于内部函数。使用 nonlocal 关键字声明该变量不是局部变量。nonlocal 语句使列出的标识符引用最近的封闭范围中以前绑定的变量,不包括全局变量。nonlocal 关键字不能用于局部或全局变量,因此必须用于引用除全局和局部范围之外的另一个范围中的变量。
下面是一个简单的示例,演示了如何在嵌套函数中使用 nonlocal 关键字:

def outer():
x = "local"
def inner():
nonlocal x # 在 inner 函数中使用 nonlocal 关键字来声明 x 变量不是局部变量
x = "nonlocal" # 在 inner 函数中更改 x 变量的值时,它实际上更改的是 outer 函数中的 x 变量
print("inner:", x)
inner()
print("outer:", x)
outer()
# 输出inner: nonlocal
# 输出outer: nonlocal
关于nonlocal有几点需要注意的
  1. nonlocal 关键字只能在嵌套函数中使用。如果在非嵌套函数中使用 nonlocal 关键字,Python 解释器会抛出 SyntaxError。
  2. nonlocal 关键字不能用于局部或全局变量。它只能用于引用除全局和局部范围之外的另一个范围中的变量。
  3. nonlocal 关键字只能用于已经在封闭范围中绑定的变量。如果在封闭范围中没有找到变量,Python 解释器会抛出 SyntaxError。
  4. nonlocal 关键字不能用于改变不可变数据类型(如字符串、元组或数字)的值。它只能用于改变可变数据类型(如列表或字典)的值。

【Python基础】变量的作用域与global、nonlocal的更多相关文章

  1. 九. Python基础(9)--命名空间, 作用域

    九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...

  2. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  3. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  4. Python基础-变量作用域

    1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...

  5. Python开发【第十二篇】python作用域和global nonlocal

    python的作用域 作用域也叫名字空间,是访问变量时查找变量名的范围空间 python中的四个作用域 LEGB 作用域 英文解释 英文缩写 局部作用域 Local(function) L 外部嵌套函 ...

  6. python基础11_函数作用域_global_递归

    看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...

  7. Python中变量的作用域

    一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...

  8. Python基础知识笔记-作用域

    Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作用域一共有4种,分别是: ...

  9. python基础——变量

    变量是只不过保留的内存位置用来存储值.这意味着,当创建一个变量,那么它在内存中保留一些空间. 根据一个变量的数据类型,解释器分配内存,并决定如何可以被存储在所保留的内存中.因此,通过分配不同的数据类型 ...

  10. Java基础 变量的作用域

    变量的作用域: 1. Java用一对大括号作为语句块的范围,称为作用域. 2.作用域中的变量不能重复定义. 3.离开作用域,变量所分配的内存空间将被JVM回收. public void name(){ ...

随机推荐

  1. 8.forEach的使用

    1 List<customer> list //一个类是customer的列表 2 3 /* for(int i = 0;i < list.size();i++){ 4 System ...

  2. DB2生成UUID, CONCAT (HEX (RAND ()), HEX (RAND ())) 排坑

    DB2中没有提供生成UUID的方法,一般我们常用的是CONCAT (HEX (RAND ()), HEX (RAND ())) 来生成UUID,但是大量生成的时候会产生重复数据,导致我们的唯一索引报错 ...

  3. linux 修改文件内容命令

    1.进入文件:vim 文件名 eg #vim /etc/httpd/httpd.conf 2.查找待修改内容位置 : (1)shift+":",使文件变成可查询状态 (2)输入 / ...

  4. Nodejs 发送 TCP 消息的正确姿势

    最近使用 NODE-RED 跟 TCP 打交道.NODE-RED 里内建了一个节点叫"tcp-out",看文档呢使用这个节点可以很方便的把 payload 用 TCP 协议发送出去 ...

  5. MS-08-067 windows smb服务 远程命令执行漏洞

    漏洞概要 MS-08-067是Windows平台中smb服务445端口的远程代码执行漏洞 利用成功可以远程控制主机 影响范围为:windows2000.xp.server 2003.server 20 ...

  6. c/c++指针从浅入深介绍——基于数据内存分配的理解(上)

    c/c++指针从浅入深介绍--基于数据内存分配的理解(上) 本文是对自我学习的一个总结以及回顾,文章内容主要是针对代码中的数据在内存中的存储情况以及存储中数值的变化来对指针进行介绍,是对指针以及数据在 ...

  7. vRealize Operations Manager 安全补丁修复

    vRealize Operations Manager 安全补丁修复 背景:记录一次安全同事在检测中发现 vRealize Operations Manager 存在安全漏洞,需要整改修复,于是到VM ...

  8. JMM内存模型

    ● 说说JVM的主要组成部分以及作用? 类加载器.运行时数据区.执行引擎.本地库接口 类加载器子系统 它主要功能是处理类的动态加载,还有链接,并且在第一次引用类时进行初始化. Loading - 加载 ...

  9. 微信-JSSDK网页调用-(微信扫一扫)

    网页调用微信扫一扫接口 1.准备工作:  1.1微信浏览器 1.2微信APPID,nonceStr 2.使用方式快速预览 调用扫一扫微信接口. 1需要获取access_token 2获取 $jsapi ...

  10. 前端ffmpeg实现视频剪切

    利用ffmpeg实现纯前端视频剪切 注意:在新版本Chrome浏览器中由于安全性问题,只能在https或localhost当中才能正常使用 1. 下载ffmpeg npm install @ffmpe ...