传递值是如何工作的?

2024-03-28 13:19:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于Python函数调用的问题。假设我要编写一个名为superLongFunc(expr)的函数。这个函数很长,很难调试。为了提高可读性,我想将函数拆分成更小的helper函数,比如smallFunc1(expr)、smallFunc2(expr)等

我的问题是,这会影响代码的性能吗?在Python中调用函数到底是如何工作的?Python是否通过引用将变量传递给函数?或者在将变量输入函数之前,它是否复制了该变量?在

我知道这是一个很无聊的问题,但它困扰了我一段时间。提前谢谢!在


Tags: 函数代码helper性能调用函数可读性函数调用expr
1条回答
网友
1楼 · 发布于 2024-03-28 13:19:24

{a1}有时称为^的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 = value形式的语句——与Python中的其他所有内容完全不同。对名称而不是值进行操作的唯一方法是do name = value。(这里有一些挑剔的例外,比如用globals()来混日子等等,但这些都是危险的领域。)尤其是name = value不同于{},obj[0] = valueobj += value,以及其他类似的看起来像赋值,但实际操作对象而不是名称的东西。在

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

相关问题 更多 >