For-loop с диапазоном принимает только последний элемент

#python #arrays #list #python-3.x #multidimensional-array

#python #массивы #Список #python-3.x #многомерный массив

Вопрос:

У меня есть 2D-массив строк, из которого я удаляю определенные элементы (те, которые содержат символ ‘#’). Когда я печатаю lista изнутри цикла, он печатает это:

 ['call', '_imprimirArray']
['movl', '24', '%2', '%3']
['movl', '%1', '%2']
['call', '_buscarMayor']
['movl', '%1', '4', '%3']
['movl', '$LC1', '%2']
['call', '_printf']
['movl', '$LC2', '%2']
['call', '_system']
['movl', '$0', '%2']
['movl', '-4', '%2', '%3']
  

Но когда я добавляю каждую строку в другой 2D-массив, присваивается только последний элемент:

 ['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3'],
['movl', '-4', '%2', '%3']
  

Вот цикл:

 def quitarEtiquetas(labels, programa):    
    lista = []
    temp = []

    for i in range(0, len(programa)):
        del lista[:]
        for j in range(0, len(programa[i])):
            if(programa[i][j].find('#') != -1):
                labels.append([programa[i][j].replace('#', ''), i])
            else:
                lista.append(programa[i][j])
        print(lista)
        temp.append(lista)
  

Комментарии:

1. то, что я удаляю его определенные элементы (если у него есть # char) — неясно, чего вы пытаетесь достичь

Ответ №1:

Вы добавляете одну и ту же строку много раз temp , просто удаляя из нее элементы на каждой итерации. Вместо del lista[:] того, чтобы просто присваивать переменной новый список: lista = [] чтобы содержимое в ранее добавленных строках не перезаписывалось.

Фактически вы делаете следующее:

 >>> lista = []
>>> temp = []
>>> lista.append('foo')
>>> temp.append(lista)
>>> temp
[['foo']]
>>> del lista[:]
>>> temp
[[]]
>>> lista.append('bar')
>>> temp.append(lista)
>>> temp
[['bar'], ['bar']]
  

Ответ №2:

Добавляя к ответу нимми, что вам нужно сделать, это:

     for i in range(0, len(programa)):
        lista = [] # creates a new empty list object alltogether
        ...
  

вместо

     for i in range(0, len(programa)):
        del lista[:]; # only clears the content, the list object stays the same
  

Кстати, ; в python нет необходимости.