diff --git a/Lib/copy.py b/Lib/copy.py index a69bc4e78c20b3..6ee55e8352471c 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -121,6 +121,13 @@ def deepcopy(x, memo=None, _nil=[]): See the module's __doc__ string for more info. """ + cls = type(x) + copier = _deepcopy_dispatch.get(cls) + + if copier is ...: + # atomic type + return x + d = id(x) if memo is None: memo = {} @@ -129,9 +136,7 @@ def deepcopy(x, memo=None, _nil=[]): if y is not _nil: return y - cls = type(x) - - copier = _deepcopy_dispatch.get(cls) + if copier is not None: y = copier(x, memo) else: @@ -169,24 +174,14 @@ def deepcopy(x, memo=None, _nil=[]): _deepcopy_dispatch = d = {} +_atomic_types = {types.NoneType, types.EllipsisType, types.NotImplementedType, + int, float, bool, complex, bytes, str, types.CodeType, type, range, + types.BuiltinFunctionType, types.FunctionType, weakref.ref, property} + +for _type in _atomic_types: + d[_type] = ... def _deepcopy_atomic(x, memo): return x -d[types.NoneType] = _deepcopy_atomic -d[types.EllipsisType] = _deepcopy_atomic -d[types.NotImplementedType] = _deepcopy_atomic -d[int] = _deepcopy_atomic -d[float] = _deepcopy_atomic -d[bool] = _deepcopy_atomic -d[complex] = _deepcopy_atomic -d[bytes] = _deepcopy_atomic -d[str] = _deepcopy_atomic -d[types.CodeType] = _deepcopy_atomic -d[type] = _deepcopy_atomic -d[range] = _deepcopy_atomic -d[types.BuiltinFunctionType] = _deepcopy_atomic -d[types.FunctionType] = _deepcopy_atomic -d[weakref.ref] = _deepcopy_atomic -d[property] = _deepcopy_atomic def _deepcopy_list(x, memo, deepcopy=deepcopy): y = []