第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在函数中改变变量指向的对象,即指向不同对象. 当在函数中修改传递进来的变量指向另一个对象时,实参的对象不会改变. >>> ...
随机推荐
- 【SpringBoot】15. Spring Boot核心注解
Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...
- MYSQL的添加字段和修改字段
ALTER TABLE 表名 ADD 字段名 字段类型 //添加字段 DESC 表名 //获取表的结构 SHOW COLUMNS FROM 表名 //也是获取表的结构 DESCRIBE 表名 //获取 ...
- leetcode128-generate-parentheses
题目描述 给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合. 例如,给出n=3,解集为: "((()))", "(()())", "( ...
- 谈谈synchronized
为什么要用synchronized关键字: synchronized是java的一种内部锁,是一种排他锁,通常也被称为悲观锁,它能够保障原子性,可见性,有序性. 当多个线程去调用同一个方法的时候,如果 ...
- Effective Modern C++ ——条款5 优先选择auto,而非显式型别声明
条款5 对于auto ,他的好处不仅仅是少打一些字这么简单. 首先在声明的时候, 使用auto会让我们养成初始化的习惯: auto x;//编译不通过必须初始化. 再次对于auto而言,它可以让我们定 ...
- linux学习,c语言头文件分类总结
1.includee 称为文件包含命令,其意义是把尖括号""或引号<>内指定的文件包含到本程序来,成为本程序的一部分.被包含的文件通常是由系统提供的,其扩展名为.h.因 ...
- 指针常量&常量指针&指向常量的指针常量
搞不懂不吃晚饭 (1)指针常量 指针常量是一个常量,但是是指针修饰的. 格式:int * const p; 例如 int a, b; int * const p = &a;//指针常量 //分 ...
- nginx&http 第三章 ngx http 框架处理流程
1. nginx 连接结构 ngx_connection_t 这个连接表示是客户端主动发起的.Nginx服务器被动接受的TCP连接,我们可以简单称其为被动连接.同时,在有些请求的处理过程中,Nginx ...
- 转载 Web前端开发 HTML设计 经验与技巧总结
文章目录1.限制input 输入框只能输入纯数字.限制长度.默认显示文字2.input输入框自动获取焦点3.用CSS让背景有透明度文字不变4.a标签禁止点击5.文字两种居中对齐6.设置一个元素一直在页 ...
- mybatis 解决属性名和字段名不一致
1. 数据库中表的设计 2. 实体类 3.mapper映射文件 4. 问题:密码没有获取到 原因:mybatis会根据查询的列名去进行设值 5. 解决列名和属性名不一致的方法 5.1 为列名指定别名, ...