Python Tips系列3 Flask中使用全局变量

说明

虽然原理很简单,但是我觉得还是值得单独写一篇文章的。这个坑花了我3个小时。

关于全局变量和局部变量的一些知识可以参考这篇文章, 具体的概念就不说了,我只说问题和结论。

问题

有两个字典,user_query_dict和query_dict。
从内容上这两个字典是一致的
Python Tips系列3 Flask中使用全局变量

然后碰到这个问题
Python Tips系列3 Flask中使用全局变量
顿时觉得三观尽毁:

  • 1 命名定义了query_dict, 而且是全局变量,为啥报这个错
  • 2 如果说有问题,那么应该是user_query_dict和query_dict同时出问题

然后一路追查,发现在后面有一行调用函数,覆盖重写了query_dict
Python Tips系列3 Flask中使用全局变量
程序按序执行,为啥后面的调用触发前面的问题?
Python Tips系列3 Flask中使用全局变量

问题出在覆盖重写query_dict

我猜是因为我的函数产生了一个新的变量,要替换掉query_dict,这时候query_dict就被解析为本地变量了(由函数局部产生的新变量)。具体来说:应该是改变了这个变量的寻址空间了。

解决办法有两个:

  • 1 global语句。通过global语句显示的声明query_dict为全局变量,那么覆盖重写还是在原有的寻址空间,只是数值改变。
  • 2 只更新不覆盖。通过update语句来改变query_dict的值,确保不要改变寻址空间应该就没问题。

Python Tips系列3 Flask中使用全局变量

实验成功,结论:

  • 在函数中使用全局变量可以查,可以改,但不能删(创建新变量也是删)。可以使用global语句来指定某个变量为全局变量,或者如果遵守查、改的操作原则,也不需要用global声明。