Инициализация Python и количество циклических ссылок

1

Можно ли инициализировать объекты Python с помощью инструкции следующим образом:

a = b = c = None

Мне кажется, когда я сделал a = b = c = list(), это вызовет круговую проблему с подсчетом ссылок.

Теги:

3 ответа

1
Лучший ответ

Нет. Это эквивалентно:

c = list()
b = c
a = b

Нет проблем. Почему вы думали, что будет проблема?

  • 0
    Выполнение a = b = c = list () приведет к тому, что все три переменные ссылаются на один и тот же список, не так ли? см. следующее: a = b = c = list () b.append ('x') print a, id (a) print b, id (b) print c, id (c) // приведенный выше код проверяет, что они ссылаются к тому же объекту. del a print b print c // почему b и c все еще существуют? Разве список не был уже удален? В чем здесь проблема? Я создал три разных списка, выполнив вышеуказанную инициализацию?
  • 0
    Нет, вы создали 3 разные ссылки на один и тот же список. Список существует до тех пор, пока не будут удалены все 3 ссылки.
Показать ещё 2 комментария
4

В вашем коде нет циклов, и даже если бы они были, сборщик мусора Python мог бы обрабатывать круговую ссылку, поэтому вам никогда не придется беспокоиться об этом.

Однако ваш код имеет другую (возможную) проблему: все три переменных указывают на один и тот же список. Это означает, что изменение, например, a, также изменит b и c (где "меняя" я имею в виду вызов мутирующей операции, например, например append. Переопределение переменной не повлияет на другие переменные).

  • 0
    +1 За указание на то, что имена (что я считаю лучшим описанием «переменных» питонов) ссылаются на тот же список.
  • 0
    Мой опыт работы с Python автоматически не очень приятен. Кажется, Python выделяет память и выделяет ее по мере необходимости. Но даже если это делается с выделенной памятью, кажется, что она не освобождает освобожденную память ядру, она просто хранит ее для будущего использования. Я видел это пару раз на своем рабочем месте, хотя не уверен, что есть другая проблема с утечкой памяти.
2

Да, вы можете это сделать. В вашем коде нет круговой ссылки, и даже если бы это было так, это не вызовет никаких проблем, поскольку у Python есть сборщик мусора, который правильно обрабатывает циклы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню