You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:集合中对象为副本而非引用,能否创建引用对象集合?

如何创建存储引用对象的集合

嘿,这个问题我之前踩过坑!确实,不少编程语言里,集合对值类型(比如基础数据类型、结构体这类)默认会存储副本,而不是原对象的引用——这就是你调试时看到x和xr是不同对象的原因。不过要实现存储引用对象的集合,完全可以做到,下面分几种常见场景给你方案:

1. 用包装类包裹值类型(通用方案)

如果你用的是面向对象语言(比如C#、Java),最稳妥的办法是给需要引用的值类型套一层包装类。因为类属于引用类型,集合里存储的会是包装类实例的引用,修改包装类内部的值时,集合里的对应项也会同步变化。

举个C#的例子:

// 通用的引用包装类
public class RefWrapper<T>
{
    public T Value { get; set; }
    public RefWrapper(T initialValue) => Value = initialValue;
}

// 使用示例
var refCollection = new List<RefWrapper<int>>();
int x = 5;
var xWrapper = new RefWrapper<int>(x);
refCollection.Add(xWrapper);

// 修改原包装类的值,集合里的项也会跟着变
xWrapper.Value = 10;
Console.WriteLine(refCollection[0].Value); // 输出 10

2. 利用语言原生的引用特性

有些语言本身支持直接存储引用或指针,比如C++:

#include <vector>
#include <functional> // 用于std::reference_wrapper

int main() {
    int x = 5;
    // 用std::reference_wrapper包装引用,存入集合
    std::vector<std::reference_wrapper<int>> refCollection;
    refCollection.push_back(x);
    
    // 修改原变量,集合里的引用会同步更新
    x = 10;
    std::cout << refCollection[0].get() << std::endl; // 输出 10
    return 0;
}

再比如Python,虽然基础值类型(int、str)是不可变的,但你可以用可变容器(比如列表)来间接实现引用效果:

ref_collection = []
x = [5]  # 用列表包装int,列表是引用类型
ref_collection.append(x)

# 修改原列表里的值,集合里的项同步变化
x[0] = 10
print(ref_collection[0][0]) # 输出 10

关键思路总结

核心逻辑很简单:让集合存储的是引用类型的实例(或引用本身)。如果是值类型,就用引用类型(类、可变容器)把它包装起来,这样集合里保存的就不是副本,而是指向原对象的引用,修改原对象时集合里的内容也会跟着改变。

内容的提问来源于stack exchange,提问作者LagunaLoire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:57:52