Python 蟒蛇lambda&;列表

Python 蟒蛇lambda&;列表,python,list,lambda,Python,List,Lambda,我有以下简单的python代码: TOPICS = ['dacha/1', 'dacha/2'] def publish(topic, payload): print(f"Publish -> Topic: {topic}, Payload: {payload}") publishers = [] for topic in TOPICS: print(topic) pub = lambda payload: publish(topic, payloa

我有以下简单的python代码:

TOPICS = ['dacha/1', 'dacha/2']

def publish(topic, payload):
  print(f"Publish -> Topic: {topic}, Payload: {payload}")  

publishers = []
for topic in TOPICS:
  print(topic)
  pub = lambda payload: publish(topic, payload)
  publishers.append(pub)

pub1, pub2 = publishers

pub1("HI!")
pub2("HI!")
以及我的输出:

dacha/1
dacha/2

Publish -> Topic: dacha/2, Payload: HI!
Publish -> Topic: dacha/2, Payload: HI!
当我在创建时传递不同的主题时,为什么主题是相同的? 也许我正在使用lambda uncorrect,或者只是它们不受这种方式的支持? 或者它只是一个python bug,我的python是:3.9.3

同样的结果:

pub1, pub2 = [
  (lambda payload: publish(topic, payload))
  for topic in TOPICS
]

万岁,我找到了一个可行的解决方案,只需改变这一行:
pub=lambda有效载荷:发布(主题,有效载荷)
到此
pub=(lambda有效载荷,主题=主题:发布(主题,有效载荷))
结果:

输出:

dacha/1
dacha/2
Publish -> Topic: dacha/1, Payload: HI!
Publish -> Topic: dacha/2, Payload: HI!

这对我有帮助:

好的,让我们试着找出问题的确切原因,试着在循环后删除局部变量
topic

def publish(topic, payload):
  print(f"Publish -> Topic: {topic}, Payload: {payload}")  

publishers = []
for topic in TOPICS:
  print(topic)
  pub = lambda payload: publish(topic, payload)
  publishers.append(pub)
del topic     ########## <--------------------------------- This one
pub1, pub2 = publishers
pub1("HI!")
pub2("HI!")
因此,这意味着Python正在寻找
topic
的局部变量引用,这就是为什么您的输出总是只有第二个主题,因为在循环退出时,topic总是会有列表中的最后一项

进一步调试:

尝试更改
publish
函数,并在格式化字符串中返回变量主题的
id

def发布(主题,有效负载): 打印(f“发布->主题:{id(主题)},有效负载:{Payload}”) 输出结果如下:

dacha/1
达卡/2
发布->主题:2574286013360,有效载荷:嗨!
发布->主题:2574286013360,有效载荷:嗨!
正如您所看到的,这两个主题都有相同的
id
,毫无疑问,它们都引用了相同的值

那么,如何解决呢?

您可以在
lambda
函数的范围内使用变量,而不是使用局部变量。 您可以将lambda函数更改为:

lambda有效负载,topic=topic:publish(topic,有效负载)
它将做的是,它将在
lambda
本身的范围内保留另一个名为
topic
的变量,也就是说,它将存储自己的
topic
值副本,并且结果保持不变,尽管稍后会更改局部变量
topic
的值

输出

dacha/1
达卡/2
发布->主题:dacha/1,有效载荷:嗨!
发布->主题:dacha/2,有效载荷:嗨!

是的,这不是bug,别担心。无法帮助查找更多信息,请尝试搜索更多信息,围绕此主题存在许多问题。问题是,在调用pub()时,它使用“topic”的最后一个值调用它,而不是创建pub时的值。lambda函数不在memoryYeah中存储变量,非常感谢,也许您知道另一种方法吗?
def publish(topic, payload):
  print(f"Publish -> Topic: {topic}, Payload: {payload}")  

publishers = []
for topic in TOPICS:
  print(topic)
  pub = lambda payload: publish(topic, payload)
  publishers.append(pub)
del topic     ########## <--------------------------------- This one
pub1, pub2 = publishers
pub1("HI!")
pub2("HI!")