python函数作用域包括局部变量和参数_python函数变量的作用域声明(全局变量和局部变量)...
函数变量的作用域声明(全局变量和局部变量)
引入问题:
局部变量:
局部变量:定义在函数内部的变量,它的作用域也仅限于函数内部,出了函数就不能使用了。
例如:
#encoding = utf-8
def demo():
tips = "No Smoking"
print("函数内部变量tips:",tips)
demo()
print ("函数外部变量tips:",tips)
可以看到,如果试图在函数外部访问其内部定义的变量,会报NameError的错误
全局变量
1、全局变量:定义在函数外部的变量,作用域是整个程序。即可以在函数外部使用,也可以在函数内部使用。
2、内部使用时,需要加global声明为全局变量。
3、内部使用时,如果不想影响全局变量,那么就声明为局部变量。
===========================================================================================
例如:
#encoding = utf-8
tips = "No Smoking"
def demo():
print("函数内部变量tips:",tips) #仅在函数内部引用全局变量
demo()
print ("函数外部变量tips:",tips)
============================================================================================
如果此时在函数内部对全局变量进行修改,会报错如下:
#encoding = utf-8
tips = "No Smoking"
def demo():
tips+="!" #对全局变量进行修改
print("函数内部变量tips:",tips)
demo()
print ("函数外部变量tips:",tips)
原因:
python解释器误把tips当成了局部变量,而此时在函数内部又没有对tips定义,所以报错。如果内部作用域想要改变外部作用域的值,需要加global。
解决方法:
1) 在函数内部对tips变量进行全局声明(使用global),这种方式会同步改变全局变量tips的值。
2) 定义一个局部变量,用来存储修改后的值。tips只在函数内部被修改了。
3) 在函数中定义一个与全局变量一样的tips。tips也只会在函数内部被修改。
#修改方式1:
#encoding = utf-8
tips = "No Smoking"
def demo():
global tips #使用global
tips+="!"
print("函数内部变量tips:",tips)
demo()
print ("函数外部变量tips:",tips)
修改方式2:
#encoding = utf-8
tips = "No Smoking"
def demo():
new_tips = tips + "!" #修改tips后的值 赋给新的变量
print("函数内部变量new_tips:",new_tips)
demo()
print ("函数外部变量tips:",tips)
修改方式3:
#encoding = utf-8
tips = "No Smoking"
def demo():
tips="No Smoking" #声明为局部变量
tips+="!"
print("函数内部变量tips:",tips)
demo()
print ("函数外部变量tips:",tips)
==========================================================================================
再看一个例子:
List = [1,2,3]
String = "hello"
def demo():
String = "hi"
List[0] = "*"
print("函数内部变量List:",List)
print("函数内部变量String:",String)
demo()
print("函数外部变量List:",List)
print("函数外部变量String:",String)
疑问:为什么定义了一个全局变量列表,函数内部对其进行修改时,不加global也不会报错?
原因:
1) 对于函数内String = "hello",它是“有歧义的”,因为它既可以是表示引用全局变量String,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global。
2) 而对于函数内的List[0] = "*",它是“明确的”,因为如果把List当作是局部变量的话,它会报NameError,所以它只能是引用全局的List,故不需要多此一举显式声明global。
3) 而如果函数内的List变量写成 List=["*"],那么List也会变成局部变量
4) 仔细想想,就会发现不止list不需要global,所有”明确的“东西都不需要global。因为int类型str类型之类的,只有一种修改方法,即x = y, 恰好这种修改方法同时也是创建变量的方法,所以产生了歧义,不知道是要修改还是创建。而dict/list/对象等,可以通过dict['x']=y或list.append()之类的来修改,跟创建变量不冲突,不产生歧义,所以都不用显式global
因此解决了最开始的,为什么字符串要在函数内部声明为全局变量,而列表不用的问题。
小结:
1)引用全局变量,不需要golbal声明
2)修改全局变量,需要使用global声明,
3)特别地,列表、字典等可变类型如果只是修改其中元素的值,可以直接使用全局变量,不需要global声明。
建议:
1) 如果函数内想用外部的全局变量,那么就写成global
2) 如果不想用外部的全局变量,那么就在函数内对变量做初始化(即声明局部变量)。
python函数作用域包括局部变量和参数_python函数变量的作用域声明(全局变量和局部变量)...相关推荐
- 【爆肝更新】Python基础教程:第五章_Python函数
原创:公众号 数据说话 [爆肝更新]Python基础教程:第五章_Python函数 函数介绍 学习目标: 快速体验一下函数的使用 了解函数的作用. 函数:是组织好的,可重复使用的,用来实现特定功能的代 ...
- python函数中变量的作用域_Python中变量的作用域(variable scope)
此文目的 此文主要讨论和总结一下,Python中的变量的作用域(variable scope). 目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域: 以避免,在写代 ...
- python查看函数参数_python函数参数
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 最简单的无参数def functionname(): pass function ...
- python中函数参数_Python函数的参数
本章将介绍函数中参数的用法,更多内容请参考:Python学习指南 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道传递正确的参数,以及函数就返回 ...
- python函数定义与参数_Python函数的定义方式与函数参数问题实例分析
本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义 ...
- python类带参数_Python函数参数传递机制(超级详细)
Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的.通过学习<Python函数值传递和引用传递>一节我们知道,根据实际参数的类型不同,函数参数的传递方式分为值传递和引 ...
- python函数定义和其四种参数_python入门第九课:函数的定义及多种参数传递方式...
本教程使用的课本是<Python编程:从入门到实践>,作者:[美] Eric Matthes 本节介绍Python中的函数,函数是可以反复使用的一段代码,有了函数能大大简化编程工作量,还能 ...
- python中自定义函数如何传递动态参数_python 函数的动态参数
1. 函数的动态参数 1. *args 位置参数动态传参 2. **kwargs 关键字参数动态传参 顺序:位置参数, *args, 默认值, **kwargs def func(*args, **k ...
- python 参数_Python函数-参数
Python中将函数作为参数,区分将参数直接写成函数名和函数名()的区别. def fun1(fun):print("---------------------")print(&q ...
最新文章
- Chapter 7. Testing and Debugging
- TCP/IP协议模型详解
- 8-12-COMPETITION
- 消息摘要算法-MAC算法系列
- 《Android游戏开发详解》——第3章,第3.1节构造方法
- python描述器descriptor_Python 黑魔法 --- 描述器(descriptor)
- We7提供电子政务信息公开最佳方案
- CentOS 6.5 x64安装nagios fetion报警
- UltraISO 创建的虚拟光驱更改盘符
- DBCP,C3P0,druid,HiKariCP连接池配置使用
- Oracle存储过程异常
- 拉格朗日乘子法 那些年学过的高数
- memcached 安装与简单实用使用
- matlab里点除,MATLAB中点除点除
- 2020-09-16 multisim14仿真电路数字八路抢答控制器仿真
- 使用excel导入功能时日期数据变成数字的解决
- 知识积累 | GATK的使用
- 几种常见的水下路由算法介绍
- 一次LoadLibrary调用失败的调试经历
- pytest接口自动化测试框架 | 用python代码测试接口
热门文章
- python中文件位置的书写
- Hbase2.1.0-CDH6.3.2 Region in Transition (永久RIT) 异常解决
- docker history 27f1068ca9da --no-trunc查看镜像dockerfile内容
- 【收藏】严重影响IDEA启动速度的插件
- Spark on K8S及history服务部署
- golang map的定义语法
- Python Django开发案例:POST方式实现登录功能
- Spring Boot 2.X 使用@Cacheable时注意事项
- Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
- SSH框架整合实现Java三层架构实例(一)