其实关于返回局部变量不只是python的问题,凡是使用堆栈结构处理函数的语言都会有这样的问题,切记不要返回局部变量。因为当创建函数的堆栈撤销,所有对局部变量的修改都灰飞烟灭。来看我的小例子

 def handle():
class myClass(object):
def __init__(self): #对各种基本数据类型测试
self.x = [] #列表
self.y = None #数值
self.z = {} #字典
self.a = str() #字符串 def _handle(self):
self.x.append('hello', 'world')
self.y = 1
self.z['hello'] = 'world'
self.a = "".join("hello") my_class = myClass() return my_class.x, my_class.y, my_class.z, my_class.a
pass
if __name__ == '__main__': my_x, my_y, my_z, my_a = handle()
pass

我们再来看执行的情况:

来看看啊,所有局部变量都保持这初始的值,所有堆栈内部的修该都灰飞烟灭了吧,所以人生苦短,远离局部。同样苦短的还有局部变量和外部变量同名的问题,依然很具迷惑性

最近在摆弄ITchat这个库,遇到不少matplotlib的小坑,后期要详细整理,先上一个容易犯的小错,自己犯了好几次了,记录一下。代码如下:

 import itchat
import pickle myFriends = None
def dumpFriends():
itchat.login()
friends = itchat.get_friends(update=True)[0:]
with open("C:\\Users\\fyc\\Desktop\\friends.txt","w") as f:
pickle.dump(friends, f) def loadFriend():
with open("C:\\Users\\fyc\\Desktop\\friends.txt", "r") as f:
myFriends = pickle.load(f)
pass if __name__ == '__main__':
dumpFriends()
loadFriend()
pass

功能主要是把微信好友列表信息序列化到文件,再读取,重点在与myFriends这个变量。一时大意,局部变量与全局变量同名了,后果是:执行完所有,myFriends没有值,依然是None

通过breakpoint,我们记录错误的细节,如下图,我截了两个图,分别是全局变量myFriends的地址,和局部变量myFriends的地址。

全局变量myFriends:

局部变量myFriends:

至此,看到重点了吧,myFriends的地址变了,说白了,这本就是两个东西,什么东西呢?还是用标签解释合适。

这正是Python以值为中心的理念,不想c/c++系列,以变量为中心,切记切记,不要同名

python函数返回局部变量,局部&全局变量同名问题的更多相关文章

  1. python_函数、局部变量与全局变量

    #函数优点:代码重用.保持一致性.可扩展性import time def logger(): """时间年-月-日 分""" time_fo ...

  2. [转]C语言的那些秘密之---函数返回局部变量

    一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了.因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错.但是如果返回的是局部变量的地 ...

  3. static作用(修饰函数、局部变量、全局变量)转自http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html

    static作用(修饰函数.局部变量.全局变量) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件 ...

  4. C语言的那些秘密之---函数返回局部变量[转]

    来源:http://blog.csdn.net/haiwil/article/details/6691854/ 一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部 ...

  5. C-基础:函数返回局部变量

    一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了.因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错.但是如果返回的是局部变量的地 ...

  6. Python学习【第9篇】:python中的局部变量与全局变量

    1.全局变量 全局变量定义后可被下面所有函数进行调用 例子: name = "xiao"def chang_name(): print("chang_name" ...

  7. Python 函数返回多值

    返回多值函数可以返回多个值吗?答案是肯定的.比如在游戏中经常需要从一个点移动到另一个点,给出坐标.位移和角度,就可以计算出新的坐标:# math包提供了sin()和 cos()函数,我们先用impor ...

  8. python函数返回值

    2016-08-09  15:01:38 python函数返回值使用return语句,可以返回任意类型的数.如果return语句执行,它之后的所有语句都不再执行. def func(x,y): pri ...

  9. Python基础笔记系列九:变量、自定义函数以及局部变量和全局变量

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 变量在前面的系列中也许就可以发现,python中的变量和C中的变量有些许不 ...

随机推荐

  1. NodeJS路由(server.js + router.js)

    手动路由... server.js 创建http服务器,解析pathname,传递给router处理. var http = require("http"); var url = ...

  2. 什么是真正的APM?

    近年来APM行业被越来越多的企业所关注,尤其是在2014年末,NewRelic的成功上市,更加激发了人们对这个行业前景的无限遐想.那么究竟什么是APM?APM的目的是什么?要求我们做什么?有不少企业对 ...

  3. HTML标签img--改变图片尺寸

    转自:https://blog.csdn.net/u012377333/article/details/50508484 1.统一大小? 我的网页上面有许多的图片,有的大,有的小,我想如果图片大的实现 ...

  4. 微信小程序 --- 绘画

    cavans及context详解 绘画API的使用 游戏的制作

  5. 树形DP求树的直径

    hdu4607 Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  6. java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式和其他常见Excel中数据转换问题

    当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型. 而且无论数字是否小数,使用cell.getNumberi ...

  7. loadrunner多场景的串行执行以及定时执行

    方法一: 既然是脚本串行执行,那在场景设计中必然是要用多个脚本,要注意的是需要将Scenario Schedule中的Schedule by设置为Group的模式.然后按实际需要依次设置每个脚本的Sc ...

  8. .NET获取Html字符串中指定标签的指定属性的值

    using System.Text; using System.Text.RegularExpressions; //以上为要用到的命名空间 /// <summary> /// 获取Htm ...

  9. Code Forces 652D Nested Segments(离散化+树状数组)

     Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  10. Python爬虫基础(一)urllib2库的基本使用

    爬虫也就是所谓的网络数据采集,是一种通过多种手段收集网络数据的方式,不光是通过与 API 交互(或者直接与浏览器交互)的方式.最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用 HTML 表 ...