【问题标题】:Recursive function call not adding values to list递归函数调用未将值添加到列表
【发布时间】:2020-09-17 04:56:13
【问题描述】:

我在没有库的帮助下使用列表创建张量。 Tensor 类有一个名为 shape_data 的方法,它通过获取维度和子列表来创建张量。

  def shape_data(self, dim, sub):
    if dim >= len(self.shape):
      return
    elif (len(sub) == 0) & (dim < (len(self.shape) - 1)):
      for i in range(self.shape[dim]):
        sub.append([])
        self.shape_data(dim + 1, sub[i])
    elif len(sub) == 0:
      if len(self.data) > self.shape[dim]:
        sub = self.data[0:self.shape[dim]]
        self.data = self.data[self.shape[dim]:]
      elif len(self.data) <= self.shape[dim]:
        sub = self.data[0:]
        self.data = []
        while len(sub) != self.shape[dim]:
          sub.append(0)

data0 = [0, 1, 2, 3, 4, 5, 0.1, 0.2, -3, -2, -1, 3, 2, 1]
shape0 = [5, 2]
tensor0 = Tensor(data0, shape0)

这是我得到的输出 [[], [], [], [], []] 与我想要的 [[0, 1], [2, 3], [4, 5], [0.1, 0.2], [-3, -2]]

我的问题是,我在这里遗漏了什么数字没有被成功复制?

【问题讨论】:

  • 请提供预期的MRE。显示中间结果与预期结果的偏差。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。我看不到类结构如何支持您面临的问题,也看不到您的跟踪尝试的结果。请参阅debugging help 这个可爱的参考。
  • 你的意思是你想做return [data0[i:i+shape0[1]] for i in range(0,shape0[0]*shape0[1],shape0[1])]?或者您是否需要递归处理更多维度的形状?
  • @PatrickArtner 我需要递归处理更多维度的形状
  • @mlai 这个问题的答案也是为未来的读者准备的——所以编辑答案并删除“用于学习体验”的固定代码是不行的。

标签: python list recursion memory


【解决方案1】:

我怀疑问题出在以下行:

sub = self.data[0:self.shape[dim]]

如果你给变量 sub 赋值,它会从那时起指向新的值。它在分配之前指向的值(您的原始列表)将保持不变。

如果您改为为该列表的元素分配某些内容,则会更改原始列表:

sub[:] = self.data[0:self.shape[dim]]

同样影响这一行:

sub = self.data[0:]

这里是更正的代码:

class Tensor():
    
  def __init__(self, data, shape):
    self.data = data
    self.shape = shape
    self.tensor = []
    self.shape_data(0, self.tensor, 0)
    print(self.tensor)

  def shape_data(self, dim, sub, pos):
    if dim >= len(self.shape):
      return
    elif (len(sub) == 0) & (dim < (len(self.shape) - 1)):
      for i in range(self.shape[dim]):
        sub.append([])
        self.shape_data(dim + 1, sub[i], i)
    elif len(sub) == 0:
      if len(self.data) > self.shape[dim]:
        sub[:] = self.data[0:self.shape[dim]]
        self.data = self.data[self.shape[dim]:]
      elif len(self.data) <= self.shape[dim]:
        sub[:] = self.data[0:]
        self.data = []
        while len(sub) != self.shape[dim]:
          sub.append(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2022-12-03
    • 2019-11-16
    相关资源
    最近更新 更多