百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Python之变量:看得见还是看不见(python 变量类型查看)

toyiye 2024-09-12 20:54 4 浏览 0 评论

引言

在前面一篇关于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}")

输出结果:

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


相关推荐

今日精选5篇教程:用Python3带你从小白入门机器学习实战教程手册

正文1:教程标题:英伟达SuperSloMoGithub项目开放作者:英伟达教程摘要:今年6月份,英伟达发布了一份生成高质量慢动作视频的论文——《SuperSloMo:HighQual...

电子书 | 笨办法学 Python 3(笨办法学python3pdf)

本周更新了5本IT电子书资源,同时站内已经有12本Python入门方面的相关电子书,可供新手选择。1、笨办法学Python3本书是一本Python入门书,适合对计算机了解不多,没有...

Python2 已终结,入手Python 3,你需要这30个技巧

选自medium作者:Erik-JanvanBaaren机器之心编译参与:王子嘉、一鸣Python2在今年和我们说拜拜了,Python3有哪些有趣而又实用的技巧呢?这篇教程有30个你会喜欢...

Python 3 系列教程(python3.9基础教程)

Python的3.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python3.0在设计的时候没有考...

Python第三课3. Python 的非正式介绍

3.Python的非正式介绍?在下面的例子中,通过提示符(>>>与...)的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每...

如何使用 Python 构建一个“谷歌搜索”系统?| 内附代码

来源|hackernoon编译|武明利,责编|Carol出品|AI科技大本营(ID:rgznai100)在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统。基本上,这...

Python 模拟微博登陆,亲测有效!(如何用python爬微博)

今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密。那么首先就要做那件必做之事!模拟登陆……代码是参考了:https://www.douban.com/note/201767245/,我对代码进...

Python 驱动的 AI 艺术批量创作: 免费的Bing 绘图代码解析

这篇文章将深入分析一段Python代码,该代码利用Bing的AI绘图功能,即bing的images/create,根据用户提供的文本提示生成图像。我们将详细探讨其工作原理、代码结构、...

Python爬虫Scrapy库的使用入门?(python scrapy爬虫)

Scrapy是一个开源的并且支持高度可扩展的Python爬虫框架,主要被用来实现从网站提取数据。出现之初就是为网页抓取而设计,但是现在它也可以被用于从APIs中抓取数据或通用的Web抓取任务。Sc...

Python3 标准库概览(python标准库有什么)

操作系统接口os模块提供了不少与操作系统相关联的函数。>>>importos>>>os.getcwd()#返回当前的工作目录'C:\\Python34...

零基础入门学习Python(三):变量和字符串

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来的是...

Python读写docx文件(python读写word)

Python读写docx文件Python读写word文档有现成的库可以处理pipinstallpython-docx安装一下。https://python-docx.readthedocs.io/...

如何利用Xpath抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

如何利用Xpath选择器抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

python之Scrapy爬虫案例:豆瓣(python爬虫书籍豆瓣评分)

python模块之Scrapy爬虫框架...

取消回复欢迎 发表评论:

请填写验证码