Когда вы делаете del a[:]
, тогда он ищет переменную a
(включая внешние контексты), а затем выполняет del found_a[:]
.
Но когда вы используете a = []
, он создает имя a
в текущем контексте и присваивает ему пустой список.Когда функция выходит из переменной a
из функции, она больше не «доступна» (уничтожена).
Короче говоря, первое работает, потому что вы изменяете a
из внешнего контекста, второе неработать, потому что вы не изменяете a
из внешнего контекста, вы просто создаете новое имя a
и временно (на время действия функции) присваивает ему пустой список.
Естьразница между del a[:]
и a = []
Обратите внимание, что на самом деле они делают что-то другое, что становится очевидным, если у вас есть дополнительные ссылки (псевдонимы) на исходный список.(как отметил @ juanpa.arrivillaga в комментариях)
del list[:]
удаляет все элементы в списке, но не создает новый список, поэтому псевдонимы также обновляются:
>>> list_1 = [1,2,3]
>>> alias_1 = list_1
>>> del alist_1[:]
>>> list_1
[]
>>> alias_1
[]
Однако a = []
создает новый список и присваивает его a
:
>>> list_2 = [1,2,3]
>>> alias_2 = list_2
>>> list_2 = []
>>> list_2
[]
>>> alias_2
[1, 2, 3]
Если вы хотите более подробное обсуждение имен и ссылок в Python, я настоятельно рекомендую Нед Батчелдерссообщение в блоге «Факты и мифы об именах и значениях Python» .
Лучшее решение?
В большинстве случаев, когда у вас есть несколько переменных, которые принадлежат друг другу, я бы использовал класс дляих.Тогда вместо reset
вы можете просто создать новый экземпляр и поработать с ним:
class FourLists:
def __init__(self):
self.a = []
self.b = []
self.c = []
self.d = []
Затем вы можете создать новый экземпляр и работать с атрибутами этого экземпляра:
>>> state = FourLists()
>>> state.a
[]
>>> state.b.append(10)
>>> state.b.extend([1,2,3])
>>> state.b
[10, 1, 2, 3]
Тогда, если вы хотите сбросить состояние, вы можете просто создать новый экземпляр:
>>> new_state = FourLists()
>>> new_state.b
[]