第5.4节 Python函数中的变量及作用域
一、函数中的变量使用规则
- 函数执行时,使用的全局空间是调用方的全局空间,参数及函数使用的局部变量存储在函数单独的局部名字空间内;
- 函数的形参在函数中修改了值时,并不影响调用方本身的数据,但如果形参是一个可变类型的容器,在函数中修改了容器中的元素,则该修改会影响到调用方的数据;
- 函数中的变量,既可以使用局部变量(本地名字空间的变量),也可以使用全局变量(全局名字空间的变量),函数在执行查找变量只读时,先在局部变量中查找,找不到再查到全局变量中查找。因此当局部变量和全局变量中有相同名字的变量时,函数使用的就是局部变量,只有当局部变量没有对应变量才会使用全局变量。一般情况下,函数只应该操作局部变量,不操作全局变量,只有特殊情况下才访问全局变量;
- 在函数内部给变量赋值且该赋值表达式中包含该变量(如x=x+1)时,该变量默认为局部变量,除非你明确地告诉Python它是全局变量或非局部变量,如果函数中没有定义要使用的变量为局部变量,又没有进行全局变量或非局部变量的声明,则Python会认为函数没有对应变量的定义和赋值,所以报错。
二、函数中对全局变量赋值的方法
1、使用global声明变量为全局变量,就是在使用前,使用语法:
global 全局变量名
然后象使用局部变量一样该变量。
2、对全局空间的字典键-值访问方式直接操作全局变量,使用前先通过globals()函数获取全局名字空间,再通过字典的键-值方式访问。举例:
#函数定义
def f(x):
g,l=globals(),locals() #取函数的全局空间和局部空间
g['x']=x*100 #修改全局空间变量x的值为局部变量x的值*100
return g,l
#调用方代码
x=1 #调用方x赋值
g1,l1=f(x) #返回函数的全局空间g1和局部空间l1,执行后x变成了100
g,l=globals(),locals() #取调用方的全局空间g和局部空间l
实际上g、g1、l是同一个对象,用is判断返回为True,但l1则不同。
3、将该全局变量存放到一个类似如列表的容器中,然后将该容器作为形参传递给函数,在函数中对容器的元素直接赋值。
三、nonlocal变量
函数中的变量除局部变量和全局变量外,还有一种变量为非本地变量,使用nonlocal来进行声明,但nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误。在此只是简单引出,使用也比较简单,不进行详细介绍。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
第5.4节 Python函数中的变量及作用域的更多相关文章
- OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析
☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...
- 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...
- 第7.14节 Python类中的实例方法详析
第7.14节 Python类中的实例方法详析 一. 实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1. 类体中定义实例方法 第一种方式很简单,就是在类体 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- Python 函数中,参数是传值,还是传引用?
在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...
- python 函数中使用全局变量
python 函数中如果需要使用全局变量,需要使用 global + 变量名 进行声明, 如果不声明,那么就是重新定义一个局部变量,并不会改变全局变量的值 n [1]: a = 3 In [2]: d ...
- Python函数中的可变参数
在Python函数中,还可以定义可变参数. 如:给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……. 要定义出这个函数,我们必须确定输入的参数.由于参数个数不确定,我们首先想到可以把 ...
- python函数中把列表(list)当参数时的"入坑"与"出坑"
在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑!! 入坑 def f(x,li=[]): for i in range(x): li.append(i*i ...
- python函数中参数是如何传递的?
python中一切皆对象,函数中参数传递的是对象的引用. 1在函数中改变变量指向的对象,即指向不同对象. 当在函数中修改传递进来的变量指向另一个对象时,实参的对象不会改变. >>> ...
随机推荐
- 【Kata Daily 190920】Square(n) Sum(平方加总)
题目: Complete the square sum function so that it squares each number passed into it and then sums the ...
- C# 集合类(一)动态数组ArrayList
C# 集合类自己经常用到: 数组(Array).动态数组(ArrayList).列表(List).哈希表(Hashtable).字典(Dictionary),对于经常使用的这些数据结构,做一个总结,便 ...
- F1分数
分类的常用指标有: accuracy:准确率 recall:召回率 precison:精确率 f1score:f1分数,是recall和precison的调和均值. 准确率什么情况下失效? 在正负样本 ...
- leetcode17gas-station
题目描述 环形路上有n个加油站,第i个加油站的汽油量是gas[i]. 你有一辆车,车的油箱可以无限装汽油.从加油站i走到下一个加油站(i+1)花费的油量是cost[i],你从一个加油站出发,刚开始的时 ...
- CentOS6.x 安装 nginx-1.19.4
1.下载nginx http://nginx.org/en/download.html wget http://nginx.org/download/nginx-1.19.4.tar.gz 2.解压 ...
- [阿里DIN]从模型源码梳理TensorFlow的形状相关操作
[阿里DIN]从模型源码梳理TensorFlow的形状相关操作 目录 [阿里DIN]从模型源码梳理TensorFlow的形状相关操作 0x00 摘要 0x01 reduce_sum 1.1 reduc ...
- 预训练模型——开创NLP新纪元
预训练模型--开创NLP新纪元 论文地址 BERT相关论文列表 清华整理-预训练语言模型 awesome-bert-nlp BERT Lang Street huggingface models 论文 ...
- MySQL死锁问题(转)
线上某服务时不时报出如下异常(大约一天二十多次):"Deadlock found when trying to get lock;". Oh, My God! 是死锁问题.尽管报错 ...
- python之路《九》 迭代器与生成器
1.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
- 线程范围内的环境变量---ThreadLocal
package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; p ...