Python:将可变对象作为参数传入或让方法在本地创建并返回它是否更好?

时间:2016-08-02 12:54:09

标签: python performance

我有一个相对简单的问题,但无法在网上找到答案。我知道在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的机制并不十分熟悉。

1 个答案:

答案 0 :(得分:1)

Python的数据模型与C ++的数据模型非常不同。

在Python中,新对象在堆上创建并绑定到名称空间中存在的变量(函数调用,类,实例和语言实现名称空间的其他部分)。

在C ++中,如果没有适当的注意,可以在堆栈上分配的函数或方法调用中创建对象。然后,如果你的函数返回对这个对象的引用,你会看到问题,因为内存可能会被重用,并且引用最多也会变得无效,最坏的情况下会很危险!

在Python中,不可能创建这种类型的“悬空引用”,因为只要对它们有任何引用,对象就会保持活动状态。因此,完全允许在函数内创建新对象并毫无后顾之忧地返回它们。这通常比强制调用者为要修改的函数创建可变对象更好。