13.1 函数中的变量

1. 函数中的变量

在函数中,我们可以看到也进行了变量的使用,那函数中的变量和函数外的变量到底有什么区别呢?

1.1. 全局变量的定义

声明在函数外面的变量,可以在文档的任意地方使用这个变量,我们称为全局变量 关于全局变量,使用方式如下

# 定义在函数外部的变量
name = "tom"
# 直接使用全局变量
print(tom)
# if代码块中使用全局变量
print(tom)
# 函数中使用全局变量
def test():
    print(tom)   # tom

1.2. 函数中使用全局变量

上面代码的输出结果,都是tom,表示全局变量一旦声明赋值,在任何地方都可以使用 但是如果我们要在函数中修改变量的值,就会出现如下的问题

name = "tom"
def test():
    name = "jerry"
    print(name)   # jerry
test()
print (name)   # tom
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 运行上述程序,我们会发现,即时函数执行了,在函数中name输出jerry
# 但是,在函数外部,我们重新打印name的值,发现name的值还是tom
# 
# 此时:函数中的name是局部变量,函数外部的name是全局变量
# 如此诡异的情况,也是python为了避免出现开发人员在操作函数的过程中
# 如果不明确是否使用全局变量的情况下,无意中覆盖全局变量的值
#
# 所以,在函数中使用全局变量,必须显示的声明使用哪个全局变量
# 语法是:global 变量名
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
name = "tom"
def test():
    global name
    name = "jerry"
    print(name)  # jerry
test()
print(name)  # jerry

1.3. 函数中的变量隔离

如果函数中没有通过global引入全局变量,但是在函数中又使用了和全局变量相同的名称 此时就会出现问题

name = "tom"
def test():
    # 这里只是想使用一下全局变量的值
    print(name)   
    # n行代码之后,又声明了局部变量name
    # 此时一旦声明了局部变量,上面打印的代码就会出现错误
    name = "jerry" 

test()
执行结果:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test
UnboundLocalError: local variable 'name' referenced before assignment

上面的错误,主要是变量提升引起的错误,首先描述一下错误出现的条件 1.如果函数中没有声明和全局变量名称一致的局部变量,函数中直接使用全局 变量的值,不会出现错误 2.如果函数中,一旦在任意位置定义了和全局变量名称一致的局部变量,函数中 在局部变量声明定义之前使用这个名称的变量,就会出现上述错误 这是因为,在函数中,一旦声明变量并且赋值一个局部变量,函数中又没有通过 global引入同名的全局变量,此时在函数中只会存在局部变量~不允许使用全局变量 此时如果在同名的局部变量声明赋值之前使用这个变量,就会出现错误。

1.2. 局部变量

声明在函数内部的变量,只能在函数内部使用,函数执行结束这个变量就会被回收,我们称为局部变量。局部变量只是在函数中可以使用,出了函数这个变量就不认识了

def test():
    name = "tom" # 这是一个test函数中的局部变量

test()
print(name) 
# 执行结果
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined # 出现错误,name没有定义

通常情况下,函数内部声明赋值的变量和函数的参数都会当成局部变量进行处理

全局变量和局部变量: 几乎所有的编程语言中都有全局变量和局部变量的区分,同时我们在开发过程中,也需要尽量避免频繁使用全局变量 原因之一全局变量一经使用就常驻内存,如果全局变量中数据过于庞大就会导致内存溢出程序崩溃的情况 原因之二是全局变量在使用的过程中容易造成变量的全局污染,因为在项目开发过程中通常是多个人协同开发多个Python文件然后整合到一起,此时就有可能会因为全局变量重名造成变量的值覆盖的情况出现。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 24. 企业级开发基础5:面向对象特征(封装)

    在我们程序开发过程中,定义好类型之后就可以通过类型来创建对象 如:我们定义一个中华人民共和国公民的类型

    大牧莫邪
  • Django来敲门~第一部分【5.3.后台管理模块】

    神说,要有光 我们说,不喜欢命令行,要有可视化的界面管理项目信息 恭喜你:django默认就提供了一个可视化的后台管理系统,当然,要使用话,简单操作几个步骤...

    大牧莫邪
  • JDK10?转一篇文章过过瘾

    工欲善其事,必先利其器。作为老牌军 Java 在发行二十多年的今天,战胜了 C 和 C++,成为诸多开发者的宠儿,且如今从其更新速度来看,也是不甘落后。

    大牧莫邪
  • SELECT 基础检索不为人知的秘密

    DQL(DATA Query Language),即数据查询语言。在数据分析狮的日常工作过程中,该语言被频繁“翻牌子”,是非常重要的指令操作语言之一。通俗的讲,...

    DataScience
  • 使用sqlite3 模块操作sqlite3数据库

    Python内置了sqlite3模块,可以操作流行的嵌入式数据库sqlite3。如果看了我前面的使用 pymysql 操作MySQL数据库这篇文章就更简单了。因...

    乐百川
  • 小朋友学C语言(30):局部变量和全局变量

    (一)局部变量 在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在...

    海天一树
  • oracle 批量清空数据中的数据

    如果执行不成功,直接使用 dbms_output.put_line 输出所需的sql再统一执行

    用户1499526
  • 手机页面的一些有用的meta

    Joel
  • 常用meta标签属性整理总汇

    注意,很多人使用initial-scale=1到非响应式网站上,这会让网站以100%宽度渲染,用户需要手动移动页面或者缩放。如果和initial-scale=1...

    德顺
  • 移动端手机web前端meta通用设置

    德顺

扫码关注云+社区

领取腾讯云代金券