2016-11-18 3 views
0

Я запускаю пустой список через следующую функцию: gp. Идея заключалась в том, чтобы добавить письмо в конец списка, а затем сбросить его, когда оно достигло длины 9. Однако он просто прекращает добавлять новые буквы, как только gp достигает 9 символов. def upd(gp): gp.append(random.choice(string.letters)) if len(gp) > 9: gp = [] Список Python не сбрасывается после прохождения этого

+0

@mhawke имеет ответ - я просто укажу, что это обычная ошибка новичка на языках, которые имеют неявную ссылочную семантику (переменные и параметры действуют как ссылки на реальный объект, а не на значение этого объекта, но с неявное разыменование для большинства операций, отличных от назначения из другой неявной ссылки на объект, который копирует ссылку, а не объект). Конечно, есть преимущества - ссылки бывают быстрыми и дешевыми, чтобы не пропускать ссылки, неявные ссылки уменьшают беспорядок и т. Д. – Steve314

ответ

3

Установка gp = [] не мутировать список gp, он просто выполняет повторную привязку локальная переменнаяgp быть пустым списком. Этот переупорядоченный внешний список (который был передан функции в gp).

Что вам нужно сделать, это явно удалить элементы из списка. Вы можете удалить все элементы на одном дыхании, как это:

def upd(gp): 
    gp.append(random.choice(string.letters)) 
    if len(gp) > 9: 
     gp[:] = [] 

Теперь это будет мутировать список gp на месте, эффективно удаляя все его элементы. Есть и другие способы сделать это, например. del gp[:] также будет работать, и gp.clear() в Python 3 (спасибо @PeterDeGlopper).

+0

Или, если не менее 3.3, 'gp.clear()'. –

+0

@PeterDeGlopper: спасибо, я добавил свою точку зрения на мой ответ. – mhawke