Python 蟒蛇lambda&;列表
我有以下简单的python代码: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
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!")