Closed
Description
Bug report
Bug description:
python 3.13 raises an RecursionError
when I try to deepcopy
the ast in the following example.
import ast
import copy
code="""
('',)
while i < n:
if ch == '':
ch = format[i]
if ch == '':
if freplace is None:
'' % getattr(object)
elif ch == '':
if zreplace is None:
if hasattr:
offset = object.utcoffset()
if offset is not None:
if offset.days < 0:
offset = -offset
h = divmod(timedelta(hours=0))
if u:
zreplace = '' % (sign,)
elif s:
zreplace = '' % (sign,)
else:
zreplace = '' % (sign,)
elif ch == '':
if Zreplace is None:
Zreplace = ''
if hasattr(object):
s = object.tzname()
if s is not None:
Zreplace = s.replace('')
newformat.append(Zreplace)
else:
push('')
else:
push(ch)
"""
tree=ast.parse(code)
# add a back reference to the parent node
for node in ast.walk(tree):
for child in ast.iter_child_nodes(node):
child.parent=node
tree2=copy.deepcopy(tree)
output (Python 3.13.0b1+):
Traceback (most recent call last):
File "/home/frank/projects/cpython/../cpython_bugs/deep_copy_ast_with_parents.py", line 50, in <module>
tree2=copy.deepcopy(tree)
File "/home/frank/projects/cpython/Lib/copy.py", line 162, in deepcopy
y = _reconstruct(x, memo, *rv)
File "/home/frank/projects/cpython/Lib/copy.py", line 253, in _reconstruct
y = func(*args)
File "/home/frank/projects/cpython/Lib/copy.py", line 252, in <genexpr>
args = (deepcopy(arg, memo) for arg in args)
~~~~~~~~^^^^^^^^^^^
File "/home/frank/projects/cpython/Lib/copy.py", line 136, in deepcopy
y = copier(x, memo)
File "/home/frank/projects/cpython/Lib/copy.py", line 196, in _deepcopy_list
append(deepcopy(a, memo))
~~~~~~~~^^^^^^^^^
...
File "/home/frank/projects/cpython/Lib/copy.py", line 162, in deepcopy
y = _reconstruct(x, memo, *rv)
File "/home/frank/projects/cpython/Lib/copy.py", line 259, in _reconstruct
state = deepcopy(state, memo)
File "/home/frank/projects/cpython/Lib/copy.py", line 136, in deepcopy
y = copier(x, memo)
File "/home/frank/projects/cpython/Lib/copy.py", line 221, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
~~~~~~~~^^^^^^^^^^^^^
File "/home/frank/projects/cpython/Lib/copy.py", line 162, in deepcopy
y = _reconstruct(x, memo, *rv)
File "/home/frank/projects/cpython/Lib/copy.py", line 253, in _reconstruct
y = func(*args)
File "/home/frank/projects/cpython/Lib/copy.py", line 252, in <genexpr>
args = (deepcopy(arg, memo) for arg in args)
~~~~~~~~^^^^^^^^^^^
File "/home/frank/projects/cpython/Lib/copy.py", line 136, in deepcopy
y = copier(x, memo)
RecursionError: maximum recursion depth exceeded
The problem can be reproduced on the current main (5c02ea8)
I was able to bisect the problem down to ed4dfd8 (@JelleZijlstra may be you know more here)
The code in the example looks big but is already minimized.
I hope that this example is simple enough to find and fix the bug, I can try to find a smaller one if it is needed.
CPython versions tested on:
3.13, CPython main branch
Operating systems tested on:
No response