11、Python之变量:看得见还是看不见

news2024/10/1 3:36:09

引言

在前面一篇关于Python变量的文章中,更多地结合对象的内存结构及字节码指令,来看不同代码针对不同的类型的对象的不同效果。


今天这篇文章中,想对新手在使用Python变量中,可能遇到的其他困惑,再展开来说一下。


大概分为这几个模块:
1、几种变量赋值操作
2、Python中的变量作用域
3、变量赋值实例

几种变量赋值操作

赋值语句

首先,从概念上来说,赋值的代码,我们一般叫做“赋值语句”。


需要注意的是,通常来说,在编程语言中,语句与表达式是有区别的,表达式是有结果值的,可以作为赋值语句的一部分,也可以是其他语句中的组成部分。但是,赋值语句就不可以了,赋值语句就应该是一个单独的代码行,而不应该,也不能出现在其他语句或者表达式中。

# 赋值语句
# a equals 10
a = 10
print(a)
# 表达式可以单独写,虽然没有啥意义
a * 2
# 表达式可以作为赋值语句的一部分
# b equals a multiply 2
b = a * 2
# 赋值语句不能作为其他非赋值语句或者表达式的一部分:
# c = (b = a) * 2


赋值表达式(海象操作符)

有时候存在一些场景,我们需要先进行赋值操作,然后对变量的值进行比较或者进一步处理,这时候就需要拆开来写:

goods_count = {
    'apple': 5,
    'banana': 0,
    'orange': 1
}
apple_cnt = goods_count.get('apple', 0)
if apple_cnt > 3:
    print(f'可销库存:{apple_cnt},不需要补货')
else:
    print(f'可销库存:{apple_cnt},需要补货了')


本着“能用一行代码搞定的,绝不应该写两行”的理念(瞎说的),Python从3.8开始,引入了新的语法,叫做“赋值表达式”,不同于赋值语句,赋值表达式是可以出现在其他语句中的。


赋值表达式使用的操作符,叫做海象操作符,可以意会。


使用赋值表达式改写一下:

goods_count = {
    'apple': 5,
    'banana': 0,
    'orange': 1
}

# 赋值表达式:apple_cnt := goods_count.get('apple', 0)
if (apple_cnt := goods_count.get('apple', 0)) > 3:
    print(f'可销库存:{apple_cnt},不需要补货')
else:
    print(f'可销库存:{apple_cnt},需要补货了')


链式赋值

不同于之前读书那会儿,学习C,新手容易犯的错误,就是链式赋值,但是,这在Python中是允许的

a = b = c = d = 10
print(a)
print(b)
print(c)
print(d)

Python中的变量作用域

有时候,明明变量有的,解释器跟看不到一样,愣是报错。
有时候,明明对变量重新赋值了,也没有报错,确又没有赋值成功。


如果是一个不理解Python解释器逻辑的Python新手,会觉得Python解释器就好像眼睛不太好使的病人……

在编程语言中,一般都有一个作用域(Scope)的概念。简单理解,就是变量能发生作用的范围。变量的作用域决定了变量在程序中的可见性和生命周期。不同的编程语言中,关于变量的作用域的设计可能会有些细微的差别。

作用域类型

在Python中,主要有四种作用域,范围从小到大,依次为:

  • 局部作用域(Local Scope):在函数内部定义的变量,仅在函数内部可见
  • 嵌套作用域(Enclosing Scope):在嵌套函数中,外部函数的变量,对内部函数可见
  • 全局作用域(Global Scope):在模块级别定义的变量,在整个模块中可见
  • 内置作用域(Built-in Scope):Python内置的变量和函数,如print、len等
LEGB规则

Python查找变量的顺序遵循LEGB规则:

  • L(Local):首先在局部作用域查找变量
  • E(Enclosing):如果在局部作用域中找不到,则在嵌套作用域查找
  • G(Global):如果在嵌套作用域中找不到,则在全局作用域查找
  • B(Built-in):如果在全局作用域中找不到,则在内置作用域查找

如果这些作用域中都没有定义名称相同的变量,那么程序就会抛出NameError异常。

变量赋值实例

对变量的使用,分为两种情况,一种是读,一种是写(重新赋值)。
关于变量读的操作,应用前面的LEGB规则就行了。

但是,对于变量的写,就有些不太一样了,要分为两种情况:
1)如果变量已经在定义在当前作用域中,那么直接把新的值交给它即可;
2)如果当前作用域中不存在这个变量,那么即便外围作用域中有同名的变量,Python还是会把本次的赋值操作当成是变量定义来处理。这时会产生的一个重要的效果,也就是说,Python会把包含赋值操作的这个函数当成新定义的这个变量的作用域。

# 全局变量
a = 10
print(f"Global Scope: {a}")

# 定义函数,改变a
def change_a():
    # 局部变量a的定义及赋值
    a = 20
    print(f"Local Scope: {a}")

# 调用函数,改变a
change_a()
# 查看全局变量a的取值
print(f"Global Scope: {a}")

输出结果:

新手可能会认为这种赋值规则比较奇怪,但是Python是故意这样设计的。这样,才能防止函数中的局部变量污染外围模块。

假如不这样做,那么函数里的每条赋值语句都有可能影响全局作用域中的变量,这样不仅混乱,而且会让全局变量之间彼此交互影响,从而导致很多难以探查的bug。

设计思想是好的,但是,现在问题来了,要怎么从局部作用域来修改全局作用域中的变量呢?Python中提供了解决方案,通过global关键字声明引用全局变量:

# 全局变量
a = 10
print(f"Global Scope: {a}")

# 定义函数,改变a
def change_a():
    # 声明引入全局变量 a
    global a
    a = 20
    print(f"Local Scope: {a}")

# 调用函数,改变a
change_a()
# 查看全局变量a的取值
print(f"Global Scope: {a}")

输出结果:

关于变量的使用及作用域,暂时就介绍到这里。更多的内容,在后面介绍到函数、闭包等,还会有所涉及。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows近源攻击应急响应

一、靶机介绍 Windows近源攻击 前景需要:小王从某安全大厂被优化掉后,来到了某私立小学当起了计算机老师。某一天上课的时候,发现鼠标在自己动弹,又发现除了某台电脑,其他电脑连不上网络。感觉肯定有学生捣乱&#x…

量子保密通信协议原理:量子保密通信实验

纸上得来终觉浅,绝知此事要躬行。 在之前的文章中,我们对量子密钥分发协议原理、分发过程进行了详细的描述,今天我们实操一波。博主向大家隆重介绍一下华中师范大学量子保密通信虚拟仿真试验平台:量子保密通信是将量子密钥分发和一…

旷野之间2 - 如何训练医疗保健小型语言模型(AI-SLM)

​​​​ 在本文中,我们将研究如何针对疾病症状训练一个小型医疗保健语言模型。为此,我们将从HuggingFace获取数据集(用于训练我们的模型):https://huggingface.co/datasets/QuyenAnhDE/Diseases_Symptoms QuyenAnhDE/Diseases_Symptoms 数据集来自 Hugging Face。图片来源…

SAP 报工BAPI中的 UPDATA TASK 和 BACKGROUND TASK

前言: 记录这篇文章起因是调查生产订单报工问题引申出来的一个问题,后来再次调查后了解了其中缘由,大概记录以下,如有不对,欢迎指正。问题原贴如下: SAP CO11N BAPI_PRODORDCONF_CREATE_TT连续报工异步更…

记一次java进程异常退出原因排查

最近在对一个Java服务进行压测,但是压测一段时间后,java进程就会自动停止,虽然怀疑可能是内存不足原因导致的,但是从服务日志中去看,并没有OOM的相关报错日志。这就很奇怪了!然后就从Java启动参数入手&…

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备…

WPF依赖附加属性

依赖附加属性的定义 基本过程:声明、注册、包装 依赖附加属性必须在依赖对象,附加属性不一定,关注的是被附加的对象是否是依赖对象 快捷方式:propa tab 关键字:RegisterAttached // 方法封装 public static int …

【系统架构设计师】九、软件工程(需求工程|系统分析与设计|DFD|DD|高内聚低耦合)

目录 四、需求工程 4.1 软件需求层次 4.2 软件需求 4.3 需求获取 4.4 需求分析 4.5 需求定义 4.6 需求确认与验证 4.7 需求管理 4.7.1 变跟控制 4.7.2 需求追踪 五、系统分析与设计 5.1 结构化方法 5.1.1 结构化需求分析 5.1.2 数据流图DFD 5.1.3 数据字典DD …

外卖商城平台小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,骑手管理,商品类型管理,商品信息管理,订单信息管理 微信端账号功能包括:系统首页,商品信息&#…

完美解决ImportError: cannot import name ‘idnadata‘的正确解决方法,亲测有效!!!

完美解决ImportError: cannot import name idnadata’的正确解决方法,亲测有效!!! 亲测有效 完美解决ImportError: cannot import name idnadata的正确解决方法,亲测有效!!!报错问题…

灭世男孩

《血腥复仇与反乌托邦之旅&#xff1a;<灭世男孩>的暴力美学盛宴》 在众多电影的海洋中&#xff0c;有一部独特而引人注目的作品——《灭世男孩》。这部由德国、南非和美国联合制作的电影&#xff0c;以其独特的风格、精彩的动作场面和深刻的主题&#xff0c;为观众带来了…

Studio One直播声音怎么调 Studio One直播没有声音输出怎么办 studio one如何设置声音变好听

Studio One做为新生代音乐工作站&#xff0c;凭借更低的价格和完备的功能&#xff0c;获得了音乐人和直播行业工作者的青睐&#xff0c;尤其是对硬件声卡的适配支持更好&#xff0c;特别适合用来配合线上教学和电商带货。 一、Studio One直播声音怎么调 在Studio One进行直播时…

odoo17 常见升级问题

通用问题 模型名变更 字段变更 方法名变更 方法参数变更 xml数据结构定义变化 xml的id变更 view视图变化&#xff0c;导致xpath路径出差 template结构变化&#xff0c;&#xff0c;导致xpath路径出差&#xff0c;或者id不存在 升16问题 前端owl的架构变化 升17问题 前端 标…

OJhelper一款帮助你获取各大oj信息的软件

项目地址 应用功能 目前应用支持&#xff1a;查询、自定义、收藏各大oj比赛信息&#xff0c;跳转比赛界面。查询各大oj的Rating分以及题量&#xff0c;查看题量饼状图。 应用环境 windows和安卓端 应用预览&#xff1a; 维护概况 后期会提供持续更新&#xff0c;具体可以…

回溯算法-以医院信息管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法&#xff0c;它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤&#xff1a; 1、 针对所给问题&#xff0c;定义问题的解空间&#xff0c;它至少包含问题的一个&#xff08;最优&#xff09;解。 2 、确定易于搜…

压缩感知3——重构算法正交匹配追踪算法

算法流程 问题的实质是&#xff1a;AX Y 求解&#xff08;A是M维&#xff0c;Y是N维且N>>M并且稀疏度K<M&#xff09;明显X有无穷多解&#xff0c;重构过程是M次采样得到的采样值升维的过程。OMP算法的具体步骤&#xff1a;(1)用X表示信号&#xff0c;初始化残差e0 …

人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作。在上一节课中的OpenCV基础操作我们了解到OpenCV是一个开源的计算机视觉软件库。它提供了各种视觉处理函数&#xff0c;并支持多种编程语言&#xff0c;如…

鸿蒙语言基础类库:【@ohos.util (util工具函数)】

util工具函数 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…

鸟类领域超大规模检测实践,基于YOLOv8轻量级检测模型开发构建超大规模生活场景下500种鸟类检测识别分析系统

关于鸟类的检测、识别相关的开发实践在前面的系列博文中也有不少的实践记录&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 【检测类】 《AI识鸟&#xff0c;基于YOLOv5【n/s/m/l/x】全系列参数模型开发构建工业野外场景下鸟类检测识别分析系统》 《基于轻量级YOL…

2018-2022 年份微博签到数据集

前阵子接到一个实验室老师的需求&#xff0c;采集五年前&#xff08;2024-52019&#xff09;过年前后的北京微博签到数据。 前两年采集的深圳签到数据是 2022 年是当年的尚可&#xff0c;这次虽然时间跨度只有两个月&#xff0c;但是由于时间太过久远&#xff0c;但是颇费了一…