Гораздо проще:
>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> [x for x in a if x >= 0 ]
[1, 2, 3, 6, 1]
Если вы действительно хотите зациклиться, попробуйте следующее:
def remove_negs(num_list):
r = num_list[:]
for item in num_list:
if item < 0:
r.remove(item)
print r
Это делает то, что вы хотите:
>>> remove_negs([ 1, 2, 3, -3, 6, -1, -3, 1])
[1, 2, 3, 6, 1]
Суть в том, что оператор присваивания r = num_list[:]
создает копию num_list. Чтобы не запутать цикл, мы удаляем элементы из r
, а не из списка, который мы зацикливаем.
Подробнее: обработка переменных в Python немного тонкая. Python хранит имена переменных, такие как r
или num_list
, отдельно от данных переменных, таких как [1, 2, 3, 6, 1]
. Имена являются просто указателями на данные. Рассмотрим оператор присваивания:
r = num_list
После выполнения этого оператора r
и num_list
указывают на одни и те же данные. Если вы вносите изменения в данные r
, вы также вносите изменения в данные num_list
, поскольку они оба указывают на одни и те же данные. Теперь рассмотрим:
r = num_list[:]
Этот оператор говорит python изменить данные num_list
, взяв только определенные их элементы. Из-за этого python делает копию данных num_list
. Так уж получилось, что [:]
указывает, что мы хотим, чтобы все данные num_list
не менялись, но это не мешает python делать копии. Копия назначена r
. Это означает, что r
и mum_list
теперь указывают на разные данные. Мы можем вносить изменения в данные r
, и это не повлияет на данные num_list
, поскольку у них другие данные.
Если это новое для вас, вы можете просмотреть это руководство о подходе Python к именам переменных и переменным данным: Понимание переменных Python и управления памятью
Примеры:
>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> b = a # a and b now point to the same place
>>> b.remove(-1)
>>> a
[1, 2, 3, -3, 6, -3, 1]
Контраст с:
>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> b = a[:] # a and b now point to different data
>>> b
[1, 2, 3, -3, 6, -1, -3, 1]
>>> b.remove(-1)
>>> b
[1, 2, 3, -3, 6, -3, 1]
>>> a
[1, 2, 3, -3, 6, -1, -3, 1]
person
John1024
schedule
06.01.2014
remove
для удаления элемента, если вы уже знаете, где он находится. Это (а) потенциально неправильно, потому чтоremove
удаляет первый элемент, равныйitem
, который может быть не тем, который вам нужен, и (б) медленно, потому что это означает, что вам нужно искать весь список, чтобы найти элемент, даже если вы уже знали, где это было.del num_list[index]
всегда лучше. Но как узнать индекс? Просто:for index, item in enumerate(num_list):
. (Это всего лишь примечание; это не решит вашу настоящую проблему… но для этого уже есть хорошие ответы и комментарии.) - person abarnert   schedule 07.01.2014