zoukankan      html  css  js  c++  java
  • 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++系列,以变量为中心,切记切记,不要同名

  • 相关阅读:
    129. Sum Root to Leaf Numbers
    113. Path Sum II
    114. Flatten Binary Tree to Linked List
    112. Path Sum
    100. Same Tree
    300. Longest Increasing Subsequence
    72. Edit Distance
    自定义js标签库
    JS 实现Table相同行的单元格自动合并示例代码
    mysql 高版本only_full_group_by 错误
  • 原文地址:https://www.cnblogs.com/fanyuchen/p/7137550.html
Copyright © 2011-2022 走看看