【Python】小练习-考察变量作用域问题

1、概述


刷视频时发现了一道Python的编程题,当时自己读完,已经有了答案,但最后不太确定,所以自己手打了一遍,运行了结果,是跟想的一样,这里考察的是一个变量作用域的知识点,相信小白学习时可能会遇到类似的问题,所有这里给大家解答下。

2、题目


有以下一段Python代码,询问最后的x,n,m的输出结果为:

(A): 16,8,2

(B): 16,5,3

python 复制代码
# 1、定义一个函数
def res(x,y):
    n = x + y
    m = x - y
    return 2*n*(m-1)

#2、定义变量n,m 
n = 5
m = 3

#3、调用函数
x = res(n,m)

# 4、输出结果
print(x,n,m)

"""
以上代码的输出结果为:
(A): 16,8,2
(B): 16,5,3
"""

3、解答


我们将结果分为以下两种情况

  1. 正常运行结果为B的情况
  2. global关键字导致结果为A的情况

(1)正常运行结果为B的情况

这里考察的是Python中变量的作用域,对于作用域在函数内和函数外的情况。

我们知道,在函数内定义的变量,他的作用域范围只限于在本函数内进行使用,若是有闭包的情况,也可以在函数中的函数中使用。

我们看,以上情况的n和m变量,在外部和函数内部都有定义,此时外部的作用域为全局,而函数内部的作用域就如我们上面所说的情况。

  • 运行到第3步时,我们调用了res函数,并将全局的n和m变量传入参数,进入函数运行,将最后的结果16作为返回值返回,使用x来接收。
  • 随后第4步输出结果,此时函数中的n和m作用域只在函数中,所以我们是无法直接获取到他们,这时系统获取到的是全局的n=5,m=3这两个值。
  • 所以输出后,全局的n和m的值未改变,所以是获取他们的值。

至此,经过以上步骤得出结果为:(B): 16,5,3

(2)global关键字导致结果为A的情况

若是想要结果为A,就需要让函数中n,m与全局n,m的作用域一致能做到改变其值的效果。

在Python中,我们可以使用global关键字,将函数内部变量全局化(前提是此函数内部变量需在全局有定义)

程序如以下代码

python 复制代码
# 定义一个函数
def res(x,y):
    #这里将n和m变量全局化
    global n,m
    n = x + y
    m = x - y
    return 2*n*(m-1)

#定义变量n,m
n = 5
m = 3

#调用函数
x = res(n,m)
# 输出结果
print(x,n,m)

"""
以上代码的输出结果为:
(A): 16,8,2
(B): 16,5,3
"""

只需要在函数内部定义一个global n,m,此时内外的n和m就指向了同一块内存地址了,不管内外谁在变化,都会影响到另一个。

比如我们在函数中将n和m的值进行了更改,那么全局的n=5和m=3的值也会跟着变化,变为了n=8,m=2的情况。

最后输出结果如下:

如此成就了A的情况。

各位小伙伴们要注意这个问题,有时候会遇到类似问题要知道是怎么回事。

更多Python知识欢迎多关注小政同学的博客,期待与大家讨论技术,共同进步!

相关推荐
宸津-代码粉碎机3 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
Y3815326624 小时前
SERP API 计费口径:credits_charged、执行失败扣费与退款边界
python·搜索引擎
chenbingjie_c4 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
Escalating_xu5 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
蒸鱼Yuzheng5 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
实心儿儿5 小时前
Qt — Qt 事件
开发语言·qt
周杰偷奶茶6 小时前
【Java】数据类型与变量
java·开发语言
code斗6 小时前
Java数据结构:堆详解
java·开发语言·数据结构
重生之小比特6 小时前
【C++进阶】map和set
java·开发语言·c++
圆圆讲门店6 小时前
挑选同城获客服务机构时需要考量的核心因素都有哪些?
大数据·网络·人工智能·python