簡體   English   中英

關鍵字參數和字典解壓縮會產生不同的結果

[英]Keyword argument and dict unpacking gives different results

我很沮喪 為什么以下兩段代碼表現不一樣?

1)

for attr in ("size", "pos"):
    self.bind(**{attr: lambda *args: setattr(self.background, attr, self.__getattribute__(attr))})

2)

self.bind(size=lambda *args: setattr(self.background, "size", self.__getattribute__("size")))
self.bind(pos=lambda *args: setattr(self.background, "pos", self.__getattribute__("pos")))

在第一個示例中,直接給出了關鍵字參數。 另一方面,通過解開字典來給出關鍵字參數。

是一些奇怪的Kivy怪癖還是帶有getattribute的東西?

這就是閉包在Python中的工作方式:您的內部函數(在本例中為lambda)捕獲對變量attr本身的引用,而不是其值。 如果在創建函數后更改attr ,則函數中使用的attr的值也會更改。 因此,您的兩個lambda最終都引用了相同的attr值(在循環中看到的最后一個值"pos" )。

為了解決這個問題,您可以使用lambda中的默認參數值捕獲該值。 構造函數時將對它們進行全面評估。

for attr in ("size", "pos"):
    self.bind(**{attr: lambda *args, attr=attr: setattr(self.background, attr, self.__getattribute__(attr))})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM