• 技术文章 >Python技术 >Python基础教程

    Python新手常见问题四:误用Python作用域的规则

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-06-28 09:36:13原创2331

    误用Python作用域的规则

    Python的作用域解析是基于叫做LEGB(Local(本地),Enclosing(封闭),Global(全局),Built-in(内置))的规则进行操作的。这看起来很直观,对吧?事实上,在Python中这有一些细微的地方很容易出错。看这个例子:

    >>> x = 10
    >>> def foo():
    ...     x += 1
    ...     print x
    ...
    >>> foo()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in foo
    UnboundLocalError: local variable 'x' referenced before assignment

    这是怎么回事?

    这是因为,在一个作用域里面给一个变量赋值的时候,Python自动认为这个变量是这个作用域的本地变量,并屏蔽作用域外的同名的变量。

    相关推荐:《Python视频教程

    很多时候可能在一个函数里添加一个赋值的语句会让你从前本来工作的代码得到一个UnboundLocalError。(感兴趣的话可以读一读这篇文章。)

    在使用列表(lists)的时候,这种情况尤为突出。看下面这个例子:

    >>> lst = [1, 2, 3]
    >>> def foo1():
    ...     lst.append(5)   
    # 这没有问题...
    ...
    >>> foo1()
    >>> lst
    [1, 2, 3, 5]
     
    >>> lst = [1, 2, 3]
    >>> def foo2():
    ...     lst += [5]      
    # ... 这就有问题了!
    ...
    >>> foo2()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in foo
    UnboundLocalError: local variable 'lst' referenced before assignment

    嗯?为什么foo2有问题,而foo1没有问题?

    答案和上一个例子一样,但是更加不易察觉。foo1并没有给lst赋值,但是foo2尝试给lst赋值。注意lst+=[5]只是lst=lst+[5]的简写,由此可以看到我们尝试给lst赋值(因此Python假设作用域为本地)。但是,这个要赋给lst的值是基于lst本身的(这里的作用域仍然是本地),而lst却没有被定义,这就出错了。

    相关推荐:

    Python新手常见问题三:在异常处理时错误的使用参数

    专题推荐:python 新手 问题
    上一篇:Python新手常见问题三:在异常处理时错误的使用参数 下一篇:python中数字列表的详细介绍

    相关文章推荐

    • Python中常用的查找数据结构及算法汇总• python新手常见问题一:乱用表达式• Python新手常见问题二:不正确的使用类变量• Python新手常见问题三:在异常处理时错误的使用参数

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网