Сбой оболочки Python при запуске этого кода - PullRequest
0 голосов
/ 28 января 2019

Я выполняю этот код без успеха.

import sys

sys.setrecursionlimit(2147483647)
Gi = 0

def recur():
    global Gi
    Gi = Gi + 1
    recur()

recur()
print(Gi)
input()

Я знаю, что изменение предела рекурсии не годится, однако я никогда не думал, что это может привести к краху Shell.Кто-то знает почему?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Документация для sys.setrecursionlimit специально гласит:

Этот предел предотвращает бесконечную рекурсию от переполнения стека C и сбоя Python.

Максимально возможный предел зависит от платформы.Пользователю может потребоваться установить более высокий лимит, если у него есть [...] платформа, которая поддерживает более высокий лимит.Это должно быть сделано с осторожностью, потому что слишком высокий лимит может привести к сбою.

Это кажется мне довольно ясным.Если вы установите слишком высокое значение, вы можете завершить работу Python.Обратите внимание, что документация конкретно относится к сбою Python , что означает интерпретатор Python, а не просто к сбою вашей программы .

В системе Linux вы можете использоватьulimit -s команда для изменения предела стека (рекурсии) операционной системы.ulimit -s unlimited снимет ограничения операционной системы для размера стека, но вы все равно можете вызвать сбой, повторяя до тех пор, пока не превысите доступную физическую память на вашем компьютере.

0 голосов
/ 28 января 2019

Каждый раз, когда recur выполняется, другой recur выполняется внутри.Когда вы делаете это, он постоянно добавляется в стек вызовов, пока не достигнет ограничений памяти вашей системы.При достижении этого предела происходит сбой из-за переполнения стека.

...