你的行为很滑稽

2024-03-29 05:39:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个python代码,解决了一个难题。它没有按预期工作。所以在调试的时候我看到了一些非常奇怪的东西。行是列表的列表。将1追加到单个row[n]将追加到行中的所有列表!你知道吗

def trap( height):
        row = []

        for index, i in enumerate(height):
            if i == 0 and len(row) == 0:
                continue
            else:
                if(i > len(row)):#time for a new row
                  #to old rows append 0 below  
                  for j in range(0, len(row)):
                        row[j].append(0)
                  row = row + [[0]] * (i - len(row))            
                else:
                  for j in range(0,i):
                     row[j].append(0)
                  #PROBLEMATIC CODE START  
                  for jo in range(i,len(row)):
                        if(index == 1):
                            print("jays are",row)
                            print("jo is",jo, row[jo])
                        row[jo].append(1)
                  #PROBLEMATIC CODE END (I GUESS?)


        print(row) #print this, it gives an idea


trap([2,0])

当我单独尝试时,效果很好,请参见:

row = [[0],[0]]
index = 1

for jo in range(0,len(row)):
      if(index == 1):
                  print("jays are",row)
                  print("jo is",jo, row[jo])
                  row[jo].append(1)
print(row)

有问题的代码在python中被标记为注释#PROBLEMATIC CODE START#PROBLEMATIC CODE END。用[2,0]调用trap()

行变量应为[[0,1],[0,1]] 但是行变量来了[[0,1,1],[0,1,1]]

我已经干了好几个小时了!我只是不明白为什么.append()会附加到行中的所有列表中,但当我尝试使用较小的代码时,它就可以工作了。请帮帮我,指引我


Tags: 代码in列表forindexlenifcode
2条回答

要回答这个问题,您需要稍微修改一下代码。你知道吗

#to old rows append 0 below  
for j in range(0, len(row)):
    row[j].append(0)
row = row + [[0]] * (i - len(row))

您需要修改它以删除同一对象上的多个引用。你知道吗

#to old rows append 0 below  
for j in range(0, len(row)):
    row[j].append(0)
row += [[0] for x in range(i - len(row))]

这样,您可能会得到正确的值。你知道吗

使用*创建列表时,您只是复制对对象的引用,而不是复制实例本身。简短示例:

>>> a = [["abv"]] * 3
>>> a
[['abv'], ['abv'], ['abv']]
>>> a[0].append(1)
>>> a
[['abv', 1], ['abv', 1], ['abv', 1]]

我正在创建一个包含对象["abv"]3次的列表。都是同一个物体,只在列表中出现了3次。 一旦我编辑了一个项目,它看起来像所有的项目都更新了,但实际上它是一样的。你知道吗

您需要像这样创建列表,以便为每个迭代创建一个新对象:

>>> a = [["abv"] for _ in range(3)]

因此,您的代码应更改为:

row += [[0] for x in range(i - len(row))]

相关问题 更多 >