天天看點

【debug】使用lambda在循環中傳參時,參數總為同一個值發現問題:分析問題:解決問題:

發現問題:

當我使用PyQt5在寫一個文本處理小工具時,需要在調用事件時傳入參數,于是想到了lambda函數,代碼如下:

def radiotext(self):
    '''文檔輸出格式選擇功能'''
    # 自動生成按鈕并命名。其中count_button為存儲按鈕名稱的清單,list_new為存儲按鈕顯示文本的清單
    for count, ele_new in zip(count_button, list_new):
        # 生成按鈕
        count = QPushButton(ele_new)
        # 關聯self.format事件
        count.clicked.connect(lambda : self.format(ele_new))
        # 按鈕樣式布局
        self.hbox11.addWidget(count)

def format(self, str_select):
    '''根據格式按鈕生成對應格式功能'''
    str = self.lineedit_format.text()
    str += str_select
    self.lineedit_format.setText(str)
           

當我執行工具時,發現生成的無論哪個按鈕,顯示文本都是同一個值,如下圖:

【debug】使用lambda在循環中傳參時,參數總為同一個值發現問題:分析問題:解決問題:

分析問題:

後來查閱資料,才發現lambda函數(或稱閉包)傳遞的不是參數的值,而是參數的實體位址,是以lambda傳遞的參數都會是同一個值。想要解決可以使用functools子產品。

解決問題:

導入functools子產品,使用partial方法。更改的代碼如下:

# 函數工具子產品
from functools import partial

def radiotext(self):
    '''文檔輸出格式選擇功能'''
    # 自動生成按鈕并命名。其中count_button為存儲按鈕名稱的清單,list_new為存儲按鈕顯示文本的清單
    for count, ele_new in zip(count_button, list_new):
        # 生成按鈕
        count = QPushButton(ele_new)
        # 關聯self.format事件
        count.clicked.connect(partial(self.format, ele_new))
        # 按鈕樣式布局
        self.hbox11.addWidget(count)

def format(self, str_select):
    '''根據格式按鈕生成對應格式功能'''
    str = self.lineedit_format.text()
    str += str_select
    self.lineedit_format.setText(str)
           

最終成功傳參:

【debug】使用lambda在循環中傳參時,參數總為同一個值發現問題:分析問題:解決問題: