python中的copy拷贝特性
copy函数只是复制了变量的内存地址,赋值的对象的内存地址指向和原对象一致,相当于直接=赋值了。
deepcopy则是直接开辟一个新的内存地址,如果需要对对象进行修改的同时不影响原来变量,则使用这个。
下面为测试代码和结果:
from mmcv import Config def test_cfg(cfg_path): cfg = Config.fromfile(cfg_path) print(cfg.model.train_cfg) cfg2 = cfg.copy() cfg2.model.train_cfg = None print(cfg.model.train_cfg) print(cfg2.model.train_cfg) def test_copy(cfg_path): cfg = Config.fromfile(cfg_path) print('origin cfg', cfg.model.train_cfg) cfg2 = cfg.copy() cfg2.model.train_cfg = None print('after altered cfg1', cfg.model.train_cfg) print('after altered cfg2', cfg2.model.train_cfg) def test_equal(cfg_path): cfg = Config.fromfile(cfg_path) print('origin cfg', cfg.model.train_cfg) cfg2 = cfg cfg2.model.train_cfg = None print('after altered cfg1', cfg.model.train_cfg) print('after altered cfg2', cfg2.model.train_cfg) def test_deepcopy(cfg_path): cfg = Config.fromfile(cfg_path) print('origin cfg', cfg.model.train_cfg) cfg2 = cfg.deepcopy() cfg2.model.train_cfg = None print('after altered cfg1', cfg.model.train_cfg) print('after altered cfg2', cfg2.model.train_cfg) if __name__ == '__main__': cfg_path = r'../ROI Transformer/main_config.py' # test_cfg(r'../ROI Transformer/main_config.py') test_deepcopy(cfg_path)
copy测试结果
=(equal)测试结果
deepcopy测试结果