【问题标题】:variable as functional binding变量作为功能绑定
【发布时间】:2021-01-29 10:01:04
【问题描述】:

在 python 中是否有使用阴影以使这段代码不会永远循环?

这里,ret 是一个变量而不仅仅是一个绑定,导致无限递归

class Node(object):
  def __init__(self, value, next=None):
    self.value = value
    self.next = next

def list2LinkedListFoldrImp(nums):
  ret = lambda x:x
  for num in nums:
    ret = lambda rs: ret(Node(num,rs)) # RecursionError: maximum recursion depth exceeded
  return ret(None)

print(list2LinkedListFoldrImp([5,4,1]))

【问题讨论】:

  • 将链表[5,4,1]转化为链表Node(5,Node(4,Node(1,None)))
  • 数据结构是递归的,所以你确实需要某种形式的递归。想想i = i + 1,你不会期望它永远递归。这是相同的,除了功能值ret。这是一个简化的例子,尽管是人为的例子
  • 我确实希望像使用任何其他值一样使用函数,尽可能不依赖巧妙的技巧。
  • 我看不出这有什么关系
  • 这个简单代码中突出显示的问题是递归构建一个函数ret,其工作是将列表转换为链表...这只是最简单的示例能想到。

标签: python recursion shadowing


【解决方案1】:

这个问题突出了这样一个事实,即只有函数调用中的参数才能在 python 中捕获,大概是因为环境只在那里创建,否则会发生变异。由于这种混合范围,我们不能只在任何地方捕获变量。

class Node(object):
  def __init__(self, value, next=None):
    self.value = value
    self.next = next

# simple and correct (sans recursion)
def list2LinkedListFoldrImp(nums):
  ret = lambda x:x
  for num in nums:
    ret = lambda rs,num=num,ret=ret: ret(Node(num,rs))
  return ret(None)
print('ok foldr', list2LinkedListFoldrImp([5,4,1]))

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多