美文网首页
python变量作用域中容易忽略的点

python变量作用域中容易忽略的点

作者: KillerManA | 来源:发表于2017-07-09 18:03 被阅读95次

python中变量作用于并不陌生,函数中的是局部变量,先看一个小例子:

In [1]: def f1(a):
   ...:     print(a)
   ...:     print(b)

调用

f1(3)

很明显这个会报错

NameError                                 Traceback (most recent call last)
<ipython-input-3-a636accabfae> in <module>()
----> 1 f1(3)

<ipython-input-1-8c139ea215ce> in f1(a)
      1 def f1(a):
      2     print(a)
----> 3     print(b)
      4

NameError: name 'b' is not defined

这时我们需要添加对b的赋值操作

b = 5

在执行一下

In [5]: f1(3)
3
5

说明在执行函数时函数会去全局变量中找b的值

这点明白之后我们再来看一个让人有点吃惊的例子:

In [6]: b = 6

In [7]: def f1(a):
   ...:     print(a)
   ...:     print(b)
   ...:     b = 9

看完函数你一定会觉得打印时候b应该显示6吧,我们看看结果

UnboundLocalError                         Traceback (most recent call last)
<ipython-input-8-a636accabfae> in <module>()
----> 1 f1(3)

<ipython-input-7-b4880e75da42> in f1(a)
      1 def f1(a):
      2     print(a)
----> 3     print(b)
      4     b = 9
      5

UnboundLocalError: local variable 'b' referenced before assignment

什么?报错了,显示本地变量在赋值前使用!

事实是:python编译函数的定义体时,判断b是局部变量,所以在执行时会获取b之前没有定义,所以报错,我们将b的定义放到打印之前就好了,这恰恰说明了python调用的过程顺序,先局部,后全局。

还有一种解决办法就是在使用b之前使用global声明b要用全局变量里面的

如果还想进一步看看解释器的加载内容,可以使用python的dis模块来查看,过程更加清晰。

相关文章

  • python变量作用域中容易忽略的点

    python中变量作用于并不陌生,函数中的是局部变量,先看一个小例子: 调用 很明显这个会报错 这时我们需要添加对...

  • 第2模块第1章21函数—作用域

    作用域 在Python中函数就是一个作用域,局部变量放置在其作用域中 C Java中作用域{}已经生成,作用域向上...

  • 关于作用域的一些注意点以及理解闭包

    先解释一下什么是“自由变量”在A作用域中使用的变量x,却没有在A作用域中声明(在其他作用域中声明),对于A作用域来...

  • 面向对象-继续

    变量的作用域&搜索规则 如果在内层作用域中声明了和外层作用域中同名的变量,那么这个变量是不会把外层的同名变量覆盖的...

  • 作用域和作用域链

    作用域 全局作用域 任何没有在方法中的变量都是在全局作用域中,全局作用域中农的变量可以在程序中的任何地方访问 ``...

  • JavaScript 对作用域的理解

    全局作用域 在全局作用域中定义的变量,在整个上下文中都是可以访问的。 函数作用域 在函数作用域中定义的变量,只能在...

  • JavaScript面试:什么是闭包?

    闭包很重要,因为它们控制特定函数在作用域中的作用和作用,以及在同一包含作用域中的兄弟功能之间共享变量。了解变量和函...

  • 2018-03-20 js学习笔记

    1.私有作用域 总结:我们应该少向全局作用域中添加过多的变量和函数,在大型项目中,多人开发时过多的全局变量容易导致...

  • 01.【JS读书笔记】作用域

    1.作用域的嵌套 在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量,或抵达最...

  • ES6-let 、const 以及解构赋值

    let 定义的变量不会被变量提升,并且是块级作用域,相同作用域下变量不能重复定义; let 定义变量在全局作用域中...

网友评论

      本文标题:python变量作用域中容易忽略的点

      本文链接:https://www.haomeiwen.com/subject/ofqehxtx.html