函数变量的作用域声明(全局变量和局部变量)

引入问题:

局部变量:

局部变量:定义在函数内部的变量,它的作用域也仅限于函数内部,出了函数就不能使用了。

例如:

#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函数变量的作用域声明(全局变量和局部变量)...相关推荐

  1. 【爆肝更新】Python基础教程:第五章_Python函数

    原创:公众号 数据说话 [爆肝更新]Python基础教程:第五章_Python函数 函数介绍 学习目标: 快速体验一下函数的使用 了解函数的作用. 函数:是组织好的,可重复使用的,用来实现特定功能的代 ...

  2. python函数中变量的作用域_Python中变量的作用域(variable scope)

    此文目的 此文主要讨论和总结一下,Python中的变量的作用域(variable scope). 目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域: 以避免,在写代 ...

  3. python查看函数参数_python函数参数

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 最简单的无参数def functionname(): pass function ...

  4. python中函数参数_Python函数的参数

    本章将介绍函数中参数的用法,更多内容请参考:Python学习指南 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道传递正确的参数,以及函数就返回 ...

  5. python函数定义与参数_Python函数的定义方式与函数参数问题实例分析

    本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义 ...

  6. python类带参数_Python函数参数传递机制(超级详细)

    Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的.通过学习<Python函数值传递和引用传递>一节我们知道,根据实际参数的类型不同,函数参数的传递方式分为值传递和引 ...

  7. python函数定义和其四种参数_python入门第九课:函数的定义及多种参数传递方式...

    本教程使用的课本是<Python编程:从入门到实践>,作者:[美] Eric Matthes 本节介绍Python中的函数,函数是可以反复使用的一段代码,有了函数能大大简化编程工作量,还能 ...

  8. python中自定义函数如何传递动态参数_python 函数的动态参数

    1. 函数的动态参数 1. *args 位置参数动态传参 2. **kwargs 关键字参数动态传参 顺序:位置参数, *args, 默认值, **kwargs def func(*args, **k ...

  9. python 参数_Python函数-参数

    Python中将函数作为参数,区分将参数直接写成函数名和函数名()的区别. def fun1(fun):print("---------------------")print(&q ...

最新文章

  1. Chapter 7. Testing and Debugging
  2. TCP/IP协议模型详解
  3. 8-12-COMPETITION
  4. 消息摘要算法-MAC算法系列
  5. 《Android游戏开发详解》——第3章,第3.1节构造方法
  6. python描述器descriptor_Python 黑魔法 --- 描述器(descriptor)
  7. We7提供电子政务信息公开最佳方案
  8. CentOS 6.5 x64安装nagios fetion报警
  9. UltraISO 创建的虚拟光驱更改盘符
  10. DBCP,C3P0,druid,HiKariCP连接池配置使用
  11. Oracle存储过程异常
  12. 拉格朗日乘子法 那些年学过的高数
  13. memcached 安装与简单实用使用
  14. matlab里点除,MATLAB中点除点除
  15. 2020-09-16 multisim14仿真电路数字八路抢答控制器仿真
  16. 使用excel导入功能时日期数据变成数字的解决
  17. 知识积累 | GATK的使用
  18. 几种常见的水下路由算法介绍
  19. 一次LoadLibrary调用失败的调试经历
  20. pytest接口自动化测试框架 | 用python代码测试接口

热门文章

  1. python中文件位置的书写
  2. Hbase2.1.0-CDH6.3.2 Region in Transition (永久RIT) 异常解决
  3. docker history 27f1068ca9da --no-trunc查看镜像dockerfile内容
  4. 【收藏】严重影响IDEA启动速度的插件
  5. Spark on K8S及history服务部署
  6. golang map的定义语法
  7. Python Django开发案例:POST方式实现登录功能
  8. Spring Boot 2.X 使用@Cacheable时注意事项
  9. Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
  10. SSH框架整合实现Java三层架构实例(一)