今天遇到一個很有趣的現象。就是之前運行pyqt5的主窗口的時候都是通過如下方式來呈現的:
if __name__=='__main__':
app = QApplication(sys.argv)
ex =Example()
sys.exit(app.exec())
上面這種可以運行並顯示一個正常的主窗口
然後呢,早上突發奇想,覺得代碼可以精簡,於是改成如下方式:
if __name__=='__main__':
app = QApplication(sys.argv)
Example()
sys.exit(app.exec())
gg!!!!
感覺跟上面沒有什麼太大的差別,唯一的區別就是構造函數執行之後的結果有沒有賦值的區別了
但是第二段代碼執行之後出現一個很奇妙的現象,就是運行之後,窗口也會出現,但是立馬閃退。一開始理解不了。後面查了相關資料,發現原因是因爲:
對象賦值其實就是引用,要是沒有賦值就是沒有引用
具體解釋:
就像linux中的硬鏈接一樣,只有還有一個硬鏈接存在,那麼這個文件就不會被刪除。這裏的對象也是一樣,只要有一個指向存在,就不會被刪除。可以用del方法進行驗證,del方法的特性就是如果一個對象沒有引用,那麼python機制就會立刻執行這個del函數。所以,Example()執行完後,發現沒有代碼可執行了,那麼內存中的對象會被清除,這樣python就會自動執行del函數。因爲窗口對象被回收了,所以窗口就自動消失了