我有一个相对简单的问题,但无法在网上找到答案。我知道在C ++中,如果你想创建一个大对象(比如一个巨大的字符串向量),你会避免这样做:
int main() {
vector<string> v = foo()
}
vector<string> foo() {
vector<string> result;
// populate result
return result;
}
而是选择下面的版本,因为上面的方法调用必须将本地向量复制到main中声明的向量,而下面的示例直接添加到main中的向量(或多或少):
int main() {
vector<string> v;
foo(v)
}
void foo(vector<string>& result) {
// populate result
return result;
}
我的问题与python有关。将可变对象作为参数传递或让方法在本地创建并返回它是否更好?我对Python的机制并不十分熟悉。
答案 0 :(得分:1)
Python的数据模型与C ++的数据模型非常不同。
在Python中,新对象在堆上创建并绑定到名称空间中存在的变量(函数调用,类,实例和语言实现名称空间的其他部分)。
在C ++中,如果没有适当的注意,可以在堆栈上分配的函数或方法调用中创建对象。然后,如果你的函数返回对这个对象的引用,你会看到问题,因为内存可能会被重用,并且引用最多也会变得无效,最坏的情况下会很危险!
在Python中,不可能创建这种类型的“悬空引用”,因为只要对它们有任何引用,对象就会保持活动状态。因此,完全允许在函数内创建新对象并毫无后顾之忧地返回它们。这通常比强制调用者为要修改的函数创建可变对象更好。