Python追加代理有趣

pad*_*dma 2 python python-3.x

我写了一个python代码来解决一个难题。它没有按预期工作。因此,在调试时,我看到了一些很奇怪的东西。行是列表的列表。将1附加到单个row[n]将追加到row内的所有列表!

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])
Run Code Online (Sandbox Code Playgroud)

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

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)

Run Code Online (Sandbox Code Playgroud)

问题代码已在python中标记为comment #PROBLEMATIC CODE START#PROBLEMATIC CODE END。调用trap()[2,0]

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

我已经在这里待了很多小时了!我只是不明白为什么会.append()附加到行内的所有列表,但是当我尝试使用较小的代码时,它将起作用。请帮我指导

Tim*_*ker 8

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

>>> a = [["abv"]] * 3
>>> a
[['abv'], ['abv'], ['abv']]
>>> a[0].append(1)
>>> a
[['abv', 1], ['abv', 1], ['abv', 1]]
Run Code Online (Sandbox Code Playgroud)

我正在创建一个包含该对象["abv"]3次的列表。它都是同一对象,在列表中仅3次。当我编辑一个项目时,看起来所有项目都已更新,但实际上都是一样的。

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

>>> a = [["abv"] for _ in range(3)]
Run Code Online (Sandbox Code Playgroud)

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

row += [[0] for x in range(i - len(row))]
Run Code Online (Sandbox Code Playgroud)