Python-传递值如何工作?

发布于 2021-01-29 19:00:21

我对Python中的函数调用有疑问。假设我要编写一个名为superLongFunc(expr)的函数。该函数非常长,而且很难调试。我想将函数拆分为较小的辅助函数,以提高可读性,例如smallFunc1(expr),smallFunc2(expr)等。

我的问题是,这是否会影响代码的性能?调用函数在Python中到底如何工作?Python是否通过引用将变量传递给函数?还是在将变量提供给函数之前对其进行了复制?

我知道这是一个非常棘手的问题,但这已经困扰了我一段时间。提前致谢!

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Python使用有时称为“按对象调用”的系统。将参数传递给函数时,不会复制任何内容。函数参数的名称在函数体内局部绑定到函数调用中提供的相同对象。

    这与大多数人认为的“按值调用”不同,因为它不会复制对象。但这也与“按引用调用”不同,因为引用是针对 对象的, 一个新 名称
    被绑定,但绑定到同一对象。这意味着您可以更改传入的对象,但是在函数内部重新绑定名称对函数外部无效。一个简单的区别示例:

    >>> def func(x):
    ...     x[0] = 2 # Mutating the object affects the object outside the function
    >>> myList = [1]
    >>> func(myList)
    >>> myList # myList has changed
    [2]
    >>> def func(x):
    ...     x = 2 # rebinding name has no effect outside the function
    >>> myList = [1]
    >>> func(myList)
    >>> myList # myList is unaffected
    [1]
    

    我对此的简单思考是,对裸名的赋值(即形式的语句)与name = valuePython中的所有其他函数完全不同。操作名称而不是值的 唯一 方法是do
    name = value。(有吹毛求疵的例外,像摆弄周围globals()等,但这些都是危险地带反正。)特别name = value是来自不同的obj.prop = valueobj[0] = valueobj += value,和其他类似的东西,看起来像分配,但实际上是在对象上,而不是名称进行操作。

    也就是说,Python中的函数调用本身就具有一定的开销(用于设置执行框架等)。如果多次调用一个函数,则此开销可能会导致明显的性能影响。因此,将一个功能拆分为多个功能可能仍然会对性能产生影响,因为每个附加功能调用都会增加一些开销。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看