当前位置: 首页 > 面试题库 >

Python-传递值如何工作?

古刚洁
2023-03-14
问题内容

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

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

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


问题答案:

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



 类似资料:
  • 问题内容: 当您将诸如list,array之类的集合传递给python中的另一个函数时,它是否会复制它,还是只是一个指针? 问题答案: Python按值传递对对象的引用。 Python按值传递对对象的引用(例如Java),Python中的所有对象都是对象。这听起来很简单,但是随后您会注意到某些数据类型似乎表现出按值传递特性,而其他数据类型似乎表现为按引用传递……这是怎么回事? 了解可变和不可变的对

  • 我创建了一个出价模型,以便类型2用户可以在类型1用户创建的一些“帖子”上出价。为了实现这一点,我在模型“出价”中为帖子字段做了一个外键。 实际上,我想把出价与一个特定的帖子联系起来,在“帖子”模型中自动生成“id”。因此,我将get_absolute_url放在我的模板中的Post'id'旁边。我是django的新手,我不确定它是否能满足我的需求。 我如何将带有post_id的出价与模板中的某个特

  • 问题内容: 在我的ASP.NET MVC应用程序中,我希望用户将值添加到文本框中,然后按Ajax.ActionLink。我想做这样的事情: Ajax.ActionLink(“ Go”,“ Action”,“ Controller”,新的{value = textbox1.value}) 还是我还能如何使此文本框值返回到我的操作?jQuery的? 问题答案: 您可以使用AJAX $ .get方法运行

  • 问题内容: 当将对象作为参数传递时,JavaScript通过引用传递它们,这使得创建对象的本地副本变得困难。 将有和。 通过克隆可以解决这个问题。简单的例子: 不会或。 题 除了创建本地副本/克隆以外,还有没有更好的方法可以按值传递对象? 问题答案: 并不是的。 根据你的实际需要,一个 可能性 可能是集作为一个新的对象的原型。 因此,您添加到的任何属性都不会添加到中。使用与中的属性相同的属性名称添

  • 问题内容: Docker 1.9允许将参数传递给dockerfile。参见链接:https : //docs.docker.com/engine/reference/builder/#arg 我该如何在ENTRYPOINT指令中传递相同的药品? 我的dockerfile有 ARG $ Version = 3.1 ENTRYPOINT /tmp/folder-$Version/sample.sh开始

  • 问题内容: 我的代码: 为什么不引用元素? Python:除非明确复制,否则所有内容都将作为参考传递[这不是True吗?] 请说明.. python如何确定 引用和复制 ? 更新: 怎么做 ? locs必须包含最终处理后的响应! 我不想使用,没有它可能吗? 问题答案: Python中的所有内容都是通过值传递和分配的,与Java中的所有值都传递和分配的方式相同。Python中的每个值都是对对象的引用