python函数局部变量和全局变量同名_python函数返回局部变量,局部&全局变量同名问题...

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

1 defhandle():2 classmyClass(object):3 def __init__(self): #对各种基本数据类型测试

4 self.x = [] #列表

5 self.y = None #数值

6 self.z = {} #字典

7 self.a = str() #字符串

8

9

10 def_handle(self):11 self.x.append(‘hello’, ‘world’)12 self.y = 1

13 self.z[‘hello’] = ‘world’

14 self.a = “”.join(“hello”)15

16

17 my_class =myClass()18

19 returnmy_class.x, my_class.y, my_class.z, my_class.a20 pass

21 if __name__ == ‘__main__’:22

23 my_x, my_y, my_z, my_a =handle()24 pass

我们再来看执行的情况:

《python函数局部变量和全局变量同名_python函数返回局部变量,局部&全局变量同名问题...》

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

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

1 importitchat2 importpickle3

4 myFriends =None5 defdumpFriends():6 itchat.login()7 friends = itchat.get_friends(update=True)[0:]8 with open(“C:\\Users\\fyc\\Desktop\\friends.txt”,”w”) as f:9 pickle.dump(friends, f)10

11 defloadFriend():12 with open(“C:\\Users\\fyc\\Desktop\\friends.txt”, “r”) as f:13 myFriends =pickle.load(f)14 pass

15

16

17

18 if __name__ == ‘__main__’:19 dumpFriends()20 loadFriend()21 pass

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

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

全局变量myFriends:

《python函数局部变量和全局变量同名_python函数返回局部变量,局部&全局变量同名问题...》

局部变量myFriends:

《python函数局部变量和全局变量同名_python函数返回局部变量,局部&全局变量同名问题...》

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

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

    原文作者:weixin_39668571
    原文地址: https://blog.csdn.net/weixin_39668571/article/details/110546474
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞