简单了解Python变量作用域正确使用方法

 更新时间:2020年06月12日 15:57:09   作者:程序员的人生A  
这篇文章主要介绍了简单了解Python变量作用域正确使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在写代码的时候,免不了要使用变量。但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的“有效范围”。

看这样一段代码:

def func(x):
  print ('X in the beginning of func(x): ', x)
  x = 2
  print ('X in the end of func(x): ', x)
x = 50func(x)print ('X after calling func(x): ', x)

输出:

X in the beginning of func(x): 50
X in the end of func(x): 2
X after calling func(x): 50

变量 x 在函数内部被重新赋值。但在调用了函数之后,x 的值仍然是50。为什么?

这就得说一下变量的“作用域”:

当函数内部定义了一个变量,无论是作为函数的形参,或是另外定义的变量,它都只在这个函数的内部起作用。函数外即使有和它名称相,另外注意:光理论是不够的。这里顺便送大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!

同的变量,也没有什么关联。这个函数体就是这个变量的作用域。像这样在函数内部定义的变量被称为“局部变量”。

要注意的是,作用域是从变量被定义的位置开始。像这样的写法是有问题的:

def func():
  print (y)
  y = 2
  print (y)

报错:

UnboundLocalError: local variable 'y' referenced before assignment

因为在 y = 2 之前,y 并不存在,调用 y 的值就会出错。

回到开始那个例子:

在函数 func 外部,定义的变量 x,赋值为 50,作为参数传给了函数 func。而在函数 func 内部,变量 x 是形参,它的作用域是整个函数体内部。它与外面的那个 x 没有关系。只不过它的初始值是由外面那个 x 传递过来的。

所以,虽然函数体内部的 x 被重新赋值为 2,也不会影响外面那个 x 的值。

不过有时候,我们希望能够在函数内部去改变一些变量的值,并且这些变量在函数外部同样被使用到。怎么办?

一种方法是,用 return 把改变后的变量值作为函数返回值传递出来,赋值给对应的变量。比如开始的那个例子,可以在函数结尾加上

return x

然后把调用改为

x = func(x)

还有一种方法,就是使用“全局变量”。

在 Python 的函数定义中,可以给变量名前加上 global 关键字,这样其作用域就不再局限在函数块中,而是全局的作用域。

通过 global 改写开始的例子:

def func():
  global x  print ('X in the beginning of func(x): ', x)
  x = 2
  print ('X in the end of func(x): ', x)
x = 50func()print ('X after calling func(x): ', x)

输出:

X in the beginning of func(x): 50
X in the end of func(x): 2
X after calling func(x): 2

函数 func 不再提供参数调用。而是通过 global x 告诉程序:这个 x 是一个全局变量。于是函数中的 x 和外部的 x 就成为了同一个变

量。这一次,当 x 在函数 func 内部被重新赋值后,外部的 x 也随之改变。

前面讲的局部变量和全局变量是 Python 中函数作用域最基本的情况。实际上,还有一些略复杂的情况,比如:

def func():
  print ('X in the beginning of func(x): ', x)  # x = 2
  print ('X in the end of func(x): ', x)
x = 50func()print ('X after calling func(x): ', x)

输出:

X in the beginning of func(x): 50
X in the end of func(x): 50
X after calling func(x): 50

程序可以正常运行。虽然没有指明 global,函数内部还是使用到了外部定义的变量。然而一旦加上

x = 2

这句,程序就会报错。因为这时候,x 成为一个局部变量,它的作用域从定义处开始,到函数体末尾结束。

建议在写代码的过程中,显式地通过 global 来使用全局变量,避免在函数中直接使用外部变量。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 在Python中实现函数重载的示例代码

    在Python中实现函数重载的示例代码

    这篇文章主要介绍了在Python中实现函数重载的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • python生成可执行exe控制Microsip自动填写号码并拨打功能

    python生成可执行exe控制Microsip自动填写号码并拨打功能

    这篇文章主要介绍了python生成可执行exe控制Microsip自动填写号码并拨打,在这需要注意一个问题,必须是已经运行Microsip.exe文件,具体实现代码跟随小编一起看看吧
    2021-06-06
  • python 实现对文件夹内的文件排序编号

    python 实现对文件夹内的文件排序编号

    下面小编就为大家分享一篇python 实现对文件夹内的文件排序编号,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python try except finally资源回收的实现

    Python try except finally资源回收的实现

    这篇文章主要介绍了Python try except finally资源回收的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 解决matplotlib.pyplot在Jupyter notebook中不显示图像问题

    解决matplotlib.pyplot在Jupyter notebook中不显示图像问题

    这篇文章主要介绍了解决matplotlib.pyplot在Jupyter notebook中不显示图像问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python使用广度优先搜索遍历混乱地铁问题

    Python使用广度优先搜索遍历混乱地铁问题

    这篇文章主要介绍了Python使用广度优先搜索遍历混乱地铁问题,广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型,需要的朋友可以参考下
    2023-04-04
  • python操作yaml说明

    python操作yaml说明

    这篇文章主要介绍了python操作yaml说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 浅谈Python实时检测CPU和GPU的功耗

    浅谈Python实时检测CPU和GPU的功耗

    本文主要介绍了浅谈Python实时检测CPU和GPU的功耗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 如何在ubuntu中切换使用不同版本的python

    如何在ubuntu中切换使用不同版本的python

    在ubuntu环境下进行嵌入式开发,我们在进行不同的项目开发时,可能会遇到python环境不统一的情况,下面这篇文章主要给大家介绍了关于如何在ubuntu中切换使用不同版本的python的相关资料,需要的朋友可以参考下
    2023-02-02
  • python中可以发生异常自动重试库retrying

    python中可以发生异常自动重试库retrying

    这篇文章主要介绍了python中可以发生异常自动重试库retrying,retrying是一个极简的使用Python编写的库,主题更多相关内容需要的朋友可以参考一下
    2022-06-06

最新评论