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

看这样一段代码:

def func(x):print ('X in the beginning of func(x): ', x)x = 2print ('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。为什么?

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

当函数内部定义了一个变量,无论是作为函数的形参,或是另外定义的变量,它都只在这个函数的内部起作用。函数外即使有和它名称相

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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():print (y)y = 2print (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 改写开始的例子:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():global x    print ('X in the beginning of func(x): ', x)x = 2print ('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 中函数作用域最基本的情况。实际上,还有一些略复杂的情况,比如:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():print ('X in the beginning of func(x): ', x)    # x = 2print ('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变量的作用域的使用相关推荐

  1. 案例详解Python变量的作用域是怎么使用的,面试必学

    在写代码的时候,免不了要使用变量.但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的"有效范围". 看这样一段代码: def func(x):print (' ...

  2. python变量的作用域

    作用域又可以被称为命名空间,指变量起作用的范围.Python变量作用域可以分为四种,分别为局部作用域.嵌套作用域.全局作用域.内置作用域. 作用域 英文 简写 局部作用域 Local L 嵌套作用域 ...

  3. 初学__Python——Python 变量的作用域

    在Python中,不同的函数可以具有相同的参数名.在函数中已经声明过变量名,在函数外还可以继续使用.在脚本运行的过程中,其值并不相互影响. def fun1(x): # 声明一个函数a = [1] # ...

  4. python变量的作用域及生命周期_Python——变量的作用域

    原创声明:本文系博主原创文章,转载及引用请注明出处. 1. 在编程语言中,变量都有一定的作用域,用来限定其生命周期,且不同类型的变量作用域不同. 在Python中解释器引用变量的顺序(优先级)为:当前 ...

  5. 关于python函数对变量的作用、错误的是_关于python变量的作用域问题

    有这样一个函数: def outside(): x=[] print(id(x)) def inside(): print(id(x)) x[:]=[1,2,3] print(id(x)) insid ...

  6. python作用域的理解-python中对变量的作用域LEGB、闭包、装饰器基本理解

    一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...

  7. python文件作用域是什么意思_python变量的作用域是什么

    变量作用域: 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量. 全局变量所有作用域都可读,局部变量只能在本函数可读 函数在读取变量时,优先读取函数本身自有的局部变量,再去读全局 ...

  8. python函数变量的作用域_python函数变量的作用域

    python 2.7 变量作用域的疑问 函数a()定义u为全局变量,并赋值为0 函数b()中,设定没有声明u的访问方式 在函数中定义和修改全局变量,需要使用global关键字.但访问全局变量(不修改它 ...

  9. python变量的作用_Python中的变量

    Python中的变量是用来表示一个值的标识符.变量代表了计算机内存中的一个地址.变量允许在程序中访问其他对象,调用函数或执行其他运算. 1.变量命名规则 变量是Python中的标识符,它应该遵循标识符 ...

最新文章

  1. 命名实体识别学习笔记——使用Ltp
  2. 小程序 音频API采坑完全手册
  3. 10个相似图片搜索以图找图的网站
  4. 采购订单中的容差项目解释
  5. 在stringgrid的drawcell事件处理过程中,给单元格赋值时,要用textout输出,不要像一般给cell[i,j]赋值那样。
  6. 在Bootstrap开发框架中使用bootstrap-datepicker插件
  7. Gym102059A Coloring Roads
  8. golang json判断类型
  9. 小说中人称转换作用_长篇儿童小说《合欢》:一树红绒落马缨
  10. 对比 C++ 和 Python,谈谈指针与引用
  11. 设计师妹子问:字体颜色渐变,你能实现?
  12. toad如何查看表字段备注(表字段的说明)
  13. 交流信号叠加直流偏置_示波器助您更好地测量直流电源轫上的纹波噪声
  14. vue中如何实现用JavaScript调用函数的方式使用一个通用的通知组件
  15. JAXB:Java对象序和XML互相转化的利器
  16. php url 2f,PHP2(url二次编码)
  17. CICD详解(八)——gitlab安装与配置
  18. python中文帮助_python中文官方手册等手册链接地址
  19. Windows安装Svn客户端
  20. 一键解决Windows聚焦不更新的方法

热门文章

  1. Android AIDL的实现
  2. [转载] 中华典故故事(孙刚)——24 嫁鸡随鸡_嫁狗随狗
  3. JUnit4中使用Hamcrest测试框架的assertThat断言 小实例
  4. 【推荐】有趣儿的PHP文件操作常用函数总结
  5. 有个小问题,大家一起研究。
  6. vb编写脚本能让计算机屏幕黑屏,,win7上设置颜色黑屏
  7. 【温故知新】CSS学习笔记(显示模式简介)
  8. 【术语扫盲】SKD 半散装件
  9. 浅谈MES与SAP PP模块的集成应用
  10. 计划策略的配置参数(1)