【问题标题】:python passing parameter to a functionpython将参数传递给函数
【发布时间】:2011-07-08 21:06:49
【问题描述】:

我不清楚在 python 中将列表作为参数传递给函数的概念。

我自己试过研究这个,没有找到足够的资源。

我想实现一个辅助函数,它从给定列表中返回许多随机项。 (在 Django 查询集中)

但是,列表可能包含多行,并且将其按值传递给函数可能会导致内存不足状态,如果我错了,请纠正我。

那么我应该如何将列表传递给函数?

【问题讨论】:

标签: python parameter-passing


【解决方案1】:

在 Python 中,有名称和值。赋值语句使名称引用一个值。赋值永远不会复制,赋值永远不会改变值。它只会更改名称所指的值。将参数传递给函数就像赋值:现在函数中参数的本地名称指的是传入的值,并且永远不会复制。这种名称引用值的机制以及更改值名称所引用的赋值的机制对于 Python 中的所有对象都是相同的,无论它们的类型如何。

由于可变和不可变的值,这会让人感到困惑。如果您将可变值(例如,列表)传递给函数并更改该值,则引用该值的调用者名称也将看到更改后的值。如果您将不可变的值传递给函数(例如,字符串或数字),则任何人都无法更改该值。

【讨论】:

  • +1 - 了解引用和可变性应该有助于 OP 弄清水域
【解决方案2】:

没有。将列表传递给函数对内存没有任何影响。 Python 确实复制列表。

【讨论】:

    【解决方案3】:

    Python 中的一切都是标识符。对于列表,您可以将评估策略视为“引用调用”。它实际上被命名为"call by sharing"

    【讨论】:

    • 标识符是一个字符串,你的意思是“引用”吗?而 Python 的调用约定是 not 通过引用传递的。经验法则:如果def f(x): x = None 有任何影响,它就是通过引用传递。在 Python 中,它没有任何作用。
    • @delnan,谢谢,我立即删除了我的答案并查找了它应该叫什么。
    • +1 用于研究和寻找合适的术语(虽然相对较少使用 - 实际上很少使用,以至于我自己通常会忘记它)。
    • 如果你认为=操作符是“(re)bind name”,而不是“set variable”,它可以正确地称为“引用调用”,这更接近事实反正。重新绑定参数不应更改另一个名称的值,即使通过引用调用也是如此。
    • @delnan:顺便说一下,它们是“标识符”而不是“引用”,因为例如 x += 5 不会更改 x 指向的内存,而是重新绑定标识符。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多