summaryrefslogtreecommitdiff
path: root/basics/opt/deep_copy_opt.py
diff options
context:
space:
mode:
authorzhang <zch921005@126.com>2022-08-08 22:46:45 +0800
committerzhang <zch921005@126.com>2022-08-08 22:46:45 +0800
commit912916a56b7f6469ce1c4cbf430f7c48ff918a3c (patch)
tree585f30a03d56eacf5b67520f1366f3529b330f41 /basics/opt/deep_copy_opt.py
parent1a83481394812c9f8dbebd60a04b3b66655cd01b (diff)
copy
Diffstat (limited to 'basics/opt/deep_copy_opt.py')
-rw-r--r--basics/opt/deep_copy_opt.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/basics/opt/deep_copy_opt.py b/basics/opt/deep_copy_opt.py
new file mode 100644
index 0000000..d537b15
--- /dev/null
+++ b/basics/opt/deep_copy_opt.py
@@ -0,0 +1,26 @@
+
+_dispatcher = {}
+
+def _copy_list(_l):
+ ret = _l.copy()
+ for idx, item in enumerate(ret):
+ cp = _dispatcher.get(type(item))
+ if cp is not None:
+ ret[idx] = cp(item)
+ return ret
+_dispatcher[list] = _copy_list
+
+def _copy_dict(d):
+ ret = d.copy()
+ for key, value in ret.items():
+ cp = _dispatcher.get(type(value))
+ if cp is not None:
+ ret[key] = cp(value)
+
+ return ret
+_dispatcher[dict] = _copy_dict
+
+
+if __name__ == '__main__':
+ l = [1, 2, 3]
+ _copy_list(l) \ No newline at end of file