python中变量的直接捕获

问题描述

出于某种原因,在这里捕获像 i 这样的变量需要定义一个函数然后调用它。仅使用该函数的主体不会捕获 i,并且在调用时使用 3,即用于 i 的最后一个值。

有没有更好的方法来捕获变量? (没有像那些函数定义/调用那样多余的语法噪音)

class Node(object):
    def __init__(self,value,next=None):
        self.value = value
        self.next = next
    
    def __str__(self):
        return str(self.value) + ',' + str(self.next)
    
    def list2LinkedListFoldrImpPb(nums):
      ret = {0:lambda x:x}
      i = 0  
      for num in nums:
        ret[i+1] = lambda rs: ret[i](Node(num,rs))#---- i NOT captured !!
        i = i+1
      return ret[i](None)
    
    def list2LinkedListFoldrImp(nums):
      ret = {0:lambda x:x}
      i = 0
      def setf(ret,i,num):
          ret[i+1] = lambda rs: ret[i](Node(num,rs))
      for num in nums:
        setf(ret,num) #---- i captured !!
        i = i+1
      return ret[i](None)
    
    
    print(list2LinkedListFoldrImpPb([5,4,1])) # maximum recursion depth exceeded  !!!
    print(list2LinkedListFoldrImp([5,1])) # works 

解决方案

作为参考,如重复链接中所述,解决方案是确保列出要作为局部参数捕获的所有变量。

主体内没有捕获,范围/环境 - 闭包的一部分 - 在调用函数时创建(和默认参数 strong> - 被视为我想象的通话的一部分 - 捕获)

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

  def __str__(self):
    return str(self.value) + ',' + str(self.next)

# Creating a function and calling it works
def list2LinkedListFoldrOK(nums):
  ret = {0:lambda x:x}
  i = 0
  def setf(ret,num):
      ret[i+1] = lambda rs: ret[i](Node(num,rs))
  for num in nums:
    setf(ret,num)
    i = i+1
  return ret[i](None)

#Pb : The i in each lambdas refers to the *last* value that i had in the scope it came from,i.e.,3
def list2LinkedListFoldrImpKO(nums):
  ret = {0:lambda x:x}
  i = 0  
  for num in nums:
    ret[i+1] = lambda rs: ret[i](Node(num,rs))
    i = i+1
  return ret[i](None)

#Solution : List all captured variables as locals via default
def list2LinkedListFoldrImpOK2(nums):
  ret = {0:lambda x:x}
  i = 0  
  for num in nums:
    ret[i+1] = lambda rs,i=i,num=num: ret[i](Node(num,rs))
    i = i+1
  return ret[i](None)

#Solution : or make an actual call 
def list2LinkedListFoldrImpOK3(nums):
  ret = {0:lambda x:x}
  i = 0  
  for num in nums:
    ret[i+1] = (lambda i,num: lambda rs: ret[i](Node(num,rs)))(i,num)
    i = i+1
  return ret[i](None)



print(list2LinkedListFoldrImpOK2([5,1]))
print(list2LinkedListFoldrImpOK3([5,1]))
print(list2LinkedListFoldrImp([5,1]))

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)