1、作用于的概念

变量作用域指的是变量生效的范围,在Python中一共有两种作用域。

  • 全局作用域

    • 全局作用域在程序执行时创建,在程序执行结束时销毁。
    • 所有函数以外的区域都是全局作用域。
    • 在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问。
  • 函数作用域
    • 函数作用域在函数调用时创建,在调用结束时销毁。
    • 函数每调用一次就会产生一个新的函数作用域(不调用不产生)。
    • 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问。

2、局部变量

所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。

def testA():
# 局部变量a
# 在函数中为变量赋值时,默认都是为局部变量赋值
# 局部变量不会影响函数外的变量。
a = 100
# 函数体内部访问,能访问到a变量
print(a) testA() # 100
print(a) # 报错:name 'a' is not defined

变量a是定义在testA函数内部的变量,在函数外部访问则立即报错。

局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。

3、全局变量

所谓全局变量,指的是在函数体内、外都能生效的变量。

思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办?

答:将这个数据存储在一个全局变量里面。

# 定义全局变量a
a = 100 def testA():
print(a) # 访问全局变量a,并打印变量a存储的数据 def testB():
print(a) # 访问全局变量a,并打印变量a存储的数据 testA() # 100
testB() # 100

思考:testB函数需求修改变量a的值为200,如何修改程序?

a = 100

def testA():
print(a) def testB():
a = 200
print(a) testA() # 100
testB() # 200
print(f'全局变量a = {a}') # 全局变量a = 100

思考:在testB函数内部的a = 200中的变量a是在修改全局变量a吗?

答:不是。观察上述代码发现,15行得到a的数据是100,仍然是定义全局变量a时候的值,而没有返回

testB函数内部的200。综上:testB函数内部的a = 200是定义了一个局部变量。

(1)global关键字

思考:如何在函数体内部修改全局变量?

a = 100

def testA():
print(a) def testB():
# 想要修改全局变量a的值是200
# global 关键字声明a是全局变量
global a
a = 200
print(a) testA() # 100
testB() # 200
print(f'全局变量a = {a}') # 全局变量a = 200

global关键字的作用是,在函数内部声明一个变量为全局变量。换句话说如果希望在函数内部修改全局变量,则需要使用global关键字来声明变量。

(2)总结

  • 如果在函数里面直接把变量a=200赋值,此时的a不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量。
  • 函数体内部修改全局变量: 先global声明a为全局变量,然后再变量重新赋值。

4、变量的查找

当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,

如果没有则继续去上一级作用域中寻找,如果有则使用,

如果依然没有则继续去上一级作用域中寻找,以此类推。

直到找到全局作用域,依然没有找到,则会抛出异常 NameError: name 'a' is not defined

# 练习说明
a = 10
def fn2():
def fn3():
a = 30
print('fn3中:','a =',a)
fn3()
print('fn2中:','a =',a) fn2()
"""
输出结果:
fn3中: a = 30
fn2中: a = 10
"""

5、作用域中可变数据类型变量

c = 10
def fn4(a):
# 在函数中对形参进行重新赋值,不会影响其他的变量
a = 20
print('a =', a, id(a)) fn4(c)
print('c =', c, id(c))
"""
输出结果:
a = 20 8791349231264
c = 10 8791349230944
""" # 如果形参接收到的数据是一个全局列表
# 当在函数内尝试修改列表中的元素时,全局列表的数据也会发生改变
c = [1,2,3]
def fn4(a):
# 如果形参执行的是一个对象,当我们通过形参去修改对象时
# 会影响到所有指向该对象的变量
a[0] = 100
print('a =', a, id(a)) fn4(c)
print('c =', c, id(c))
"""
输出结果:
a = [100, 2, 3] 5132808
c = [100, 2, 3] 5132808
""" # 如果我们不向全局变量有所改动
# 就需要使用我们之前学过的浅复制,
# 或者传入一个切片,就可以解决
c = [1, 2, 3] def fn4(a):
# 在函数中对形参进行重新赋值,不会影响其他的变量
a[0] = 100
print('a =', a, id(a)) fn4(c.copy())
# fn4(c[:])
print('c =', c, id(c))
"""
输出结果:
a = [100, 2, 3] 6050824
c = [1, 2, 3] 6050312
"""

6、多函数程序执行流程

一般在实际开发过程中,一个程序往往由多个函数组成,并且多个函数共享某些数据,如下所示:

(1)共用全局变量

# 1. 定义全局变量
glo_num = 0 def test1():
global glo_num
# 修改全局变量
glo_num = 100 def test2():
# 调用test1函数中修改后的全局变量
print(glo_num) # 2. 调用test1函数,执行函数内部代码:声明和修改全局变量
test1()
# 3. 调用test2函数,执行函数内部代码:打印
test2() # 100

(2)返回值作为参数传递

# 先得到函数一的返回值,再把这个返回值传入到函数二
def test1():
return 50 def test2(num):
print(num) # 1. 保存函数test1的返回值
result = test1() # 2.将函数返回值所在变量作为参数传递到test2函数
test2(result) # 50

『无为则无心』Python函数 — 30、Python变量的作用域的更多相关文章

  1. 『无为则无心』Python函数 — 26、Python函数参数的传递方式

    目录 1.位置参数 2.关键字参数 3.缺省参数(默认参数) 4.不定长参数(可变参数) (1)包裹位置传递 (2)包裹关键字传递 5.位置参数.默认参数.可变参数的混合使用 6.拓展:参数解包 提示 ...

  2. 『无为则无心』Python函数 — 27、Python函数的返回值

    目录 1.返回值概念 2.return关键字的作用 3.返回值可以返回的数据类型 4.函数如何返回多个值 5.fn5 和 fn5()的区别 6.总结: 1.返回值概念 例如:我们去超市购物,比如买饮料 ...

  3. 『无为则无心』Python函数 — 29、Python变量和参数传递

    目录 1.Python的变量 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 (3)注意点 2.了解变量的引用 3.Python的参数传递(重点) (1)示例 (2)结论 (3)总结 ...

  4. 『无为则无心』Python函数 — 25、Python中的函数

    目录 1.函数的使用 (1)定义函数 (2)调用函数 (3)使用函数的注意事项 2.函数的参数 3.实参的类型 Python函数的说明: Python中函数的应用非常广泛,前面章节中我们已经接触过多个 ...

  5. 『无为则无心』Python函数 — 28、Python函数的简单应用

    目录 1.函数嵌套调用 2.Python函数的简单应用 (1)打印线条 (2)函数计算 (3)打印图形 3.函数的说明文档 (1)函数的说明文档的作用 (2)函数说明文档的语法 (3)查看函数的说明文 ...

  6. 『无为则无心』Python函数 — 31、命名空间(namespace)

    目录 1.什么是命名空间 2.三种命名空间 3.命名空间查找顺序 4.命名空间的生命周期 5.如何获取当前的命名空间 1.什么是命名空间 命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名 ...

  7. 『无为则无心』Python函数 — 33、高阶函数

    目录 1.高阶函数的定义 2.体验高阶函数 3.内置高阶函数 (1)map()函数 (2)reduce()函数 (3)filter()函数 1.高阶函数的定义 把函数作为参数传入(把一个函数作为另外一 ...

  8. 『无为则无心』Python序列 — 23、Python序列的公共API

    目录 1.运算符 @1.+加号 @2.*乘号 @3.in或not in 2.公共方法 @1.len()方法 @2.del和del() @3.max()方法 @4.min()方法 @5.range() ...

  9. 『无为则无心』Python基础 — 4、Python代码常用调试工具

    目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...

随机推荐

  1. 查看IP访问量的shell脚本汇总

    第一部分,1,查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[ ...

  2. jQuery - focusin/focusout/focus/blur事件的区别与不同

    focus与blur事件:不支持冒泡 focusin与focusout:支持冒泡 事件触发顺序: 对于同时支持这4个事件的浏览器,事件执行顺序为focusin(聚焦) > focus > ...

  3. 【C/C++】习题3-3 数数字/算法竞赛入门经典/数组和字符串

    [题目] 把前n个(n<=10000)的整数顺序写在一起:123456789101112-- 数一数0~9各出现多少次(输出10个整数,分别是0,1,2,--,9出现的次数) [解答] 暴力求解 ...

  4. 2020信息安全铁人三项 pwn复盘

    第一赛区 hacknote 程序存在格式化字符串漏洞和uaf,不多说了,很简单. 1 from pwn import * 2 3 p = process('./hacknote') 4 elf = E ...

  5. 调配资源(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 当资源过度分配了,肿么办? 比如前面的例子,某吃货甲,一天之内给他分配了9.6个工时的吃量,这怎么可以呢,让人加班是不厚道 ...

  6. 异步FIFO总结+Verilog实现

    异步FIFO简介 异步FIFO(First In First Out)可以很好解决多比特数据跨时钟域的数据传输与同步问题.异步FIFO的作用就像一个蓄水池,用于调节上下游水量. FIFO FIFO是一 ...

  7. CF628B New Skateboard 题解

    Content 有一个长度为 \(n\) 的数字串 \(s\),求出有多少个子串能够被 \(4\) 整除. 数据范围:\(1\leqslant n\leqslant 3\times 10^5\). S ...

  8. microsoft project 出现不能保存为xls文件时可以按照如下方法解决

    工具->选项->安全性

  9. Vue-Router(一)

    Vue-Router(一) 简介 vue-router是Vuejs的官方推荐路由,让用 Vue.js 构建单页应用变得非常容易.目前Vue路由最新的版本是4.x版本. vue-router是基于路由和 ...

  10. Kafka Eagle分布式模式

    1.概述 最近有同学留言,Kafka Eagle的分布式模式功能怎么使用,如何部署安装?今天笔者就为大家来详细介绍一下Kafka Eagle的分布式模式功能的安装和使用. 2.内容 首先,这里我们需要 ...