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++系列,以變量為中心,切記切記,不要同名

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM