Необъяснимые переменные в глобальном пространстве имен - PullRequest
0 голосов
/ 04 марта 2019

Я обнаружил, что если я не назначу возвращаемое значение функции переменной, она все равно попадет в глобальное пространство имен.Чтобы воссоздать ситуацию в миниатюре, я создал тестовый класс и функцию, которая возвращает экземпляр этого класса:

class testclass:
    def __init__(self):
        pass

def test_func():
    return testclass()

Затем я создал функцию, чтобы подсчитать, сколько из нихпеременные находятся в глобальном пространстве имен:

def count_tc(glob):
    num = 0
    for name, obj in glob.items():
        if isinstance(obj, testclass):
            print(name)
            num+=1
    return num

, если я первоначально запускаю эту функцию count_tc, она возвращает 0. Но если я запускаю test_func, а затем повторно запускаю его, я получаю:

test_func()
count_tc(globals())

Возвращение

_
_8
2

Итак, теперь у нас есть не одна, а две переменные в глобальном пространстве имен, которым, похоже, присвоены имена _ типов.

Я понимаю процесс сборки мусора в python:что если нет ссылок на объект, он удаляется - поэтому я ожидаю, что это произойдет в этом случае.Это игрушечный пример, но у меня это происходит где-то еще, где память является проблемой, и, кажется, создает проблемы.Может ли кто-нибудь просветить меня относительно того, что (или что должно быть) происходит здесь?Я не уверен, что это актуально, но я запускаю это в блокноте Jupyter.Спасибо!

1 Ответ

0 голосов
/ 05 марта 2019

См. https://ipython.readthedocs.io/en/stable/interactive/tutorial.html#history

По сути, Ipython автоматически захватывает объект, возвращаемый вашим вызовом test_func(), таким образом увеличивая количество ссылок.GC работает так, как вы ожидаете.Вот почему вы не видите, чтобы экземпляр testclass сохранялся при запуске кода через обычный интерпретатор python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...