引言:拷贝陷阱示例
在实际开发中,常遇到如下配置修改导致的意外问题。
Python 示例
configs = [{"name": "web", "port": 8080}]
backup_configs = configs.copy()
# 修改备份配置
backup_configs[0]["port"] = 9090
print("原配置端口:", configs[0]["port"]) # 输出什么?
明明只改了 backup_configs,为什么原配置 configs 的端口也变成 9090 了?同样的问题在 Java 中也会出现。
Java 示例
List<Map<String, Object>> configs = new ArrayList<>();
Map<String, Object> config = new HashMap<>();
config.put("name", "web");
config.put("port", 8080);
configs.add(config);
List<Map<String, Object>> backupConfigs = new ArrayList<>(configs); // 拷贝
backupConfigs.get(0).put("port", 9090);
System.out.println("原配置端口: " + configs.get(0).get("port")); // 也是 9090!
这就是浅拷贝的经典陷阱。本文深入解析 Python 和 Java 中的拷贝机制。
Python 拷贝的三重境界
境界一:赋值——贴标签游戏
a = [1, 2, 3]
b = a # 这只是贴了个新标签而已
print(a is b)
((a), (b))
a[] =
(b)

