Python - 传递值如何工作?

tur*_*oup 13 python styles function

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

我的问题是,这是否会影响代码的性能?调用函数究竟是如何在Python中运行的?Python是否通过引用将变量传递给函数?或者它是否在将变量提供给函数之前复制变量?

我知道这是一个相当不错的问题,但它一直困扰着我.提前致谢!

Bre*_*arn 16

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

这与大多数人认为的"按值调用"不同,因为它不会复制对象.但它也与"按引用调用"不同,因为引用是指对象 --- 绑定一个新名称,但绑定到同一个对象.这意味着您可以改变传入的对象,但重新绑定函数内的名称对函数外没有影响.一个简单的例子:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

我对此的简单思考方式是赋予一个简单的名称 - 即表单的语句 - 与name = valuePython中的其他内容完全不同.操作名称而不是值的唯一方法就是这样做name = value.(有吹毛求疵的例外,像周围碴globals()等,但这些都是危险地带反正.)特别name = value是来自不同的obj.prop = value,obj[0] = value,obj += value,和看起来像分配,但实际上上的对象,而不是名操作其他类似的东西.

也就是说,Python中的函数调用本身就有一定的开销(用于设置执行帧等).如果多次调用函数,则此开销会对性能产生显着影响.因此,将一个函数拆分为多个函数仍然会对性能产生影响,因为每个额外的函数调用都会增加一些开销.

  • 它与类型无关."name = value"形式的赋值重新绑定名称.其他一切都在价值观上运作. (4认同)
  • 您所描述的只是按值调用,其中值是对象的引用. (3认同)
  • 这两个例子之间的区别在于第一个操作在`x`指向的*object*上,但是第二个操作在*name*`x`本身上(通过将它分配给一个新对象).这就是为什么第二个没有效果. (2认同)