【问题标题】:Need explanation of lambda behavior in example需要在示例中解释 lambda 行为
【发布时间】:2022-01-20 23:50:25
【问题描述】:

我正在研究作为强化学习一部分的 python 代码

LEFT, RIGHT = range(2)
pi = lambda s: {
    0:LEFT, 1:LEFT, 2:LEFT, 3:LEFT, 4:LEFT, 5:LEFT, 6:LEFT
}[s]

for s in range(7):
    print(pi(s))

output:
0
0
0
0
0
0
0

我的问题是 lambda 的 [s] 是什么?在这种情况下什么 lambda 行为。字典是否保存在列表中?如果字典保存在列表中,我们必须通过列表访问,我们必须将 pi[0][s] 放入打印中,对吗?请解释

【问题讨论】:

  • [s] 是访问字典的值。就像dict[s] 一样,它会给左值。 s 是从 0 到 6 的参数。
  • 问题是“存在 lambda 的 [s] 是什么?”但“现在”是什么意思?
  • s 是传递给匿名 lambda 函数的参数的名称。 [s] 使用字典中的键引用值。
  • 该代码以极其复杂的方式执行了本应是列表索引操作的操作。 pi = [LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, LEFT] ... print(pi[s])for p in pi: print(p).
  • 这里的 pi 是一个用 lambda 表示法定义的函数。但是这个函数很奇怪,因为如果参数是 0,1,2,3,4,5 或 6,它总是返回 0。这里的目标不明确。

标签: python lambda


【解决方案1】:
pi = lambda s: {
    0:LEFT, 1:LEFT, 2:LEFT, 3:LEFT, 4:LEFT, 5:LEFT, 6:LEFT
}[s]

不过是

def pi(s):
    return {0:LEFT, 1:LEFT, 2:LEFT, 3:LEFT, 4:LEFT, 5:LEFT, 6:LEFT}[s]

在哪里

{0:LEFT, 1:LEFT, 2:LEFT, 3:LEFT, 4:LEFT, 5:LEFT, 6:LEFT}[s]

正在输入一个字典(此处为{0:LEFT, 1:LEFT, 2:LEFT, 3:LEFT, 4:LEFT, 5:LEFT, 6:LEFT})键s 的属性。 所以{0:LEFT, 1:LEFT, 2:LEFT, 3:LEFT, 4:LEFT, 5:LEFT, 6:LEFT}[1] 给出了LEFT,因为LEFT 是键1 的属性。

【讨论】:

  • 或者只是简单的return [LEFT, LEFT, LEFT, LEFT, LEFT, LEFT][s](或使用元组),使用字典没有意义
【解决方案2】:

上面的代码定义了这个字典:

dict = {
    0:LEFT, 1:LEFT, 2:LEFT, 3:LEFT, 4:LEFT, 5:LEFT, 6:LEFT
}

或者(left = 0):

dict = {
    0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0
}

pi lambda 返回dict[s],其中s 是字典中的key。 所以调用pi(s) 等于返回dict[s] for key = s

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多