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


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

     1 def handle():
     2     class myClass(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     return my_class.x, my_class.y, my_class.z, my_class.a
    20     pass
    21 if __name__ == '__main__':
    22     
    23     my_x, my_y, my_z, my_a = handle()
    24     pass

    我们再来看执行的情况:

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

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

     1 import itchat
     2 import pickle
     3 
     4 myFriends = None
     5 def dumpFriends():
     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 def loadFriend():
    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:

    局部变量myFriends:

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

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

  • 相关阅读:
    P1847 轰炸II
    c++ 如何对拍
    P2689 东南西北
    P2006 赵神牛的游戏
    P1320 压缩技术(续集版)
    vuex
    less
    将二维数组转化成一维数组
    剩余数组(从'水果数组'筛选掉'吃了的数组')
    将一维数组转化成二维数组
  • 原文地址:https://www.cnblogs.com/fanyuchen/p/7137550.html
Copyright © 2020-2023  润新知