2012-05-16 76 views
4

目前,我的代碼是這樣的:lambda函數和變量的作用域

for control in self.controls(): 
    self.connect(control, SIGNAL('clicked()'), lambda: self.button(control.objectName())) 

當我運行我的代碼,我lambda函數需要control最後元素在我的元素列表,這是不我期望會發生什麼。

奇怪的是,當我手動運行lambda每次循環,它工作正常,每個循環,但它像以前一樣仍然有同樣的問題到底:

for control in self.controls(): 
    func = lambda: self.button(control.objectName()) 
    func() # Prints the correct output 

    self.connect(control, SIGNAL('clicked()'), func) # When triggered, still breaks 

self.button()功能平凡定義:

def button(self, name): 
    print name 

我檢查了的controlfunc每次循環的唯一通過打印的id(control)id(func)輸出,他們都返回唯一NUM別爾斯。除此之外,control.objectName()是正確的對象名稱。

我有一種感覺,這是一個可變範圍問題,因爲我通常不會在我的代碼中經常使用lambda。有人看到任何明顯的錯誤嗎?

+0

[複製](http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters) – Avaris

+1

而作爲一個側面說明:考慮使用[新風格的信號/插槽](http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html)。 – Avaris

+0

@Avaris:在我發佈我的問題後,我切換了*正確*。不過,感謝您的鏈接,我不知道它有官方文檔。 – Blender

回答

2

SPLAT.

for control in self.controls(): 
    self.connect(control, SIGNAL('clicked()'), lambda control=control: 
    self.button(control.objectName())) 
+0

解決了這個問題,謝謝! – Blender