资讯专栏INFORMATION COLUMN

【大坑记】Python中的全局变量变成了局部变量

DobbyKim / 782人阅读

摘要:后来好奇自己写了个小程序测验同样报了错误于是猜出了,在定义这个函数的时候,我们在函数内存在给全局变量赋值的操作,它就默认把函数内的变成了本地变量。

上线前忙忙乎乎写代码,更新了一个同事的代码,发现日志模块报错了

伪代码如下:

from flask import current_app

def add_log(data, app=None):
    if app:
        current_app = app
    current_app.game_logger.info(data)

add_log(data)

错误代码:

UnboundLocalError: local variable "current_app" referenced before assignment

因为确认在flask的app上下文中,而且没有传app参数进去,所以光看代码逻辑,一直很奇怪为啥会报current_app不存在的错误。

后来好奇自己写了个小程序测验

g = 10

def test(a=None):
    if a:
        g = a
    print g

test()

同样报了UnboundLocalError错误

local variable "g" referenced before assignment

于是猜出了,在定义这个函数的时候,我们在函数内存在给全局变量 g 赋值的操作,它就默认把函数内的 g 变成了本地变量。(即便这条赋值语句并没有被执行)

所以解决方法是,就是很简单的加个 global 申明全局变量

修改后的代码

g = 10

def test(a=None):
    global g
    if a:
        g = a
    print g

test()

输出正常了- -

诶,说到底就是基础不够扎实啊╮(╯_╰)╭

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37824.html

相关文章

  • Python变量命名与作用域的坑

    摘要:循环中当为时,将对象返回并作为全局变量的内容是字符串,接下来,报错。幸运的是,代码修改以后,执行正常,我也找到了一些文章来解释这个问题,我的第一感觉也没有错,的确是变量作用域的问题,代码在执行过程中,实际上是在访问,而不是我们期望的。 使用python有些年头了,自认为对Python的基本知识很了解了,今天发生的一件事让我对Python有了更多的认识,写成文章做个记录。 同事让我帮忙看...

    amuqiao 评论0 收藏0
  • 《JavaScript 闯关》之作用域和闭包

    摘要:作用域和闭包是最重要的概念之一,想要进一步学习,就必须理解作用域和闭包的工作原理。全局和局部作用域的关系在函数体内,局部变量的优先级高于同名的全局变量。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。 作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 JavaScript 作用域和闭包的工作原理。 作用域 任何...

    Jacendfeng 评论0 收藏0
  • js温故而知新2——学习廖雪峰的js教程

    摘要:让我们拆开写小明正常结果单独调用函数怎么返回了请注意,我们已经进入到了的一个大坑里。如果单独调用函数,比如,此时,该函数的指向全局对象,也就是。 函数 1. arguments JavaScript还有一个免费赠送的关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array: function fo...

    Caizhenhao 评论0 收藏0
  • 《JavaScript 闯关》之垃圾回收和内存管理

    摘要:内存回收此时,局部变量就没有存在的必要了,因此可以释放它们的内存以供将来使用。局部变量会在它们离开执行环境时自动被解除引用,如下面这个例子所示手工解除的引用由于局部变量在函数执行完毕后就离开了其执行环境,因此无需我们显式地去为它解除引用。 JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。而...

    Sleepy 评论0 收藏0
  • python基础知识之函数初阶——命名空间

    摘要:在内置命名空间不能使用全局和局部的名字。可以形象地理解成内置命名空间具有最高级别,不需要定义就可以使用,全局命名空间次之,最低级是局部命名空间。 python中的命名空间分三种: 内置的命名空间,在启动解释器的时候自动加载进内存的各种名字所在的空间,比如print,input等不需要定义就可以使用的名字 全局命名空间,就是从上到下所有我们定义的变量名和函数名所在的空间,是在程序从上到下...

    dack 评论0 收藏0

发表评论

0条评论

DobbyKim

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<