【问题标题】:python function changing list valuespython函数更改列表值
【发布时间】:2013-09-04 01:16:12
【问题描述】:

我正在尝试递归调用函数,并将列表的一部分传递给函数。

def op3(c,i):
    d = []
    for l in range(0,len(c),+1):
        d.append(c[l])
    a, b = [], []
    if len(d)>=3:
        for l in range(1,len(d)-1,+1):
            a.append(d[l])
        for l in range(2,len(d),+1):
            b.append(d[l])
        A,B = [],[]
        for j in range(0,len(a),+1):
            a[j][i] = a[j][i]+a[j][i+1]
            a[j].pop(i+1)
            insertf(a,final)
            A.append(a[j])
        op3(A,i+1)
        for k in range(0,len(b),+1):
            b[k][i+1] = b[k][i+1]+b[k][i+2]
            b[k].pop(i+2)
            insertf(b,final)
            B.append(b[k])
        op3(B,i+1)

但是在第一个嵌套的“for”循环运行后,原始列表中的值在列表“b”中更改为 d 的新值。 我对python相当陌生。我读过这就是列表在 python 中的工作方式。有没有解决的办法?

【问题讨论】:

  • 使用不可变的数据结构,比如tuple?或者newList=copy.deepcopy(otherList) 创建一个完全独立的列表?
  • 如果您不是询问您的解决方案,而是询问您尝试使用该功能解决的真正问题,您会收到更多有用的答案。见XY problem

标签: python list function


【解决方案1】:

所有修改后的 C 风格 for 循环都让我头疼。正在尝试解析...

def op3(c,i):
  d = c[:]
  if len(d)>=3:
    a=d[1:-1]
    b=d[2:]
    #A,B=[],[]
    for item in a:
      item[i] += item.pop(i+1)
      insertf(a,final)   # Totally unknown behaviour, does this modify a?
      #A.append(item)  # Seems pointless, A ends up a copy of a, and op3 
      #                # does not modify c (only its items)
    op3(a,i+1)
    for item in b:
      item[i+1] += item.pop(i+2)
      insertf(b,final)
    op3(b,i+1)

因此,从代码的作用来看,它需要一个列表列表,并修改内部列表。它还以一种似乎没有停止条件的方式递归地调用自己,但如果内部列表用完any((len(ci)<=i+2 for ci in c)),它将中断。

总的来说,我想说我们不能提供一个好的答案,因为这个代码片段并没有表达你想要做什么。这里的关键点似乎是列表不是二维的。每个列表 a[j] 或 b[k] 都是一个独立的对象(尽管 a[j] is b[j-1] 因为您从同一个列表 c 中提取它们),并且不知道您对 a,b,c,d,A 所做的操作,乙。

能否请您描述一下您拥有和期望的数据结构,以及您尝试进行的处理类型?感觉有点像它适合 numpy 的一种表达方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2020-01-24
    • 2022-11-19
    • 2013-07-15
    相关资源
    最近更新 更多