Python传递参数给函数

3

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

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

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

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

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


尝试在这里查看:http://docs.python.org/reference/datamodel.html 和 http://blog.objectmentor.com/articles/2008/05/22/pythons-mutable-default-problem。这个想法是将参数传递给函数取决于它们的类型。 - Artsiom Rudzenka
1
值是如何传递给函数的并不取决于它们的类型!您能否修改该值取决于其类型。 - Ned Batchelder
4个回答

6
在Python中,有名称和值。赋值语句使一个名称引用一个值,但是它不会创建副本,也不会改变一个值。它只会改变名称所引用的值。将参数传递给函数类似于赋值:现在函数中参数的本地名称引用已传入的值,并且永远不会进行复制。对于Python中的所有对象,无论其类型如何,这种将名称引用值的机制以及赋值更改名称引用的值都是相同的。
这很容易混淆,因为存在可变和不可变的值。如果将可变值(例如列表)传递到函数中并更改该值,则调用者引用该值的名称也将看到更改后的值。如果将不可变值(例如字符串或数字)传递到函数中,则任何人都不能更改该值。

+1 - 理解引用和可变性应该有助于帮助原帖作者澄清问题。 - Jeremy Brown

3

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


2
一个标识符是一个字符串,你是不是想说“引用”?而Python的调用约定不是按引用传递。经验法则:如果def f(x): x = None有任何影响,那么它就是按引用传递。在Python中,它没有任何影响。 - user395760
+1 是为了研究和找到适当的术语(尽管相对较少使用 - 实际上,我自己经常忘记它)而设立的。 - user395760
如果您将 = 操作符视为 "(重新)绑定名称" 而非 "设置变量",那么它可以被适当地称为 "按引用调用"。这更贴近事实。重新绑定参数不应该改变另一个名称的值,即使按引用调用也是如此。 - Jasmijn
@Neil:“标识符”是语法和解析器中的构造。指出Python中的变量、成员属性等仅仅是指针(也称为引用,这与按引用传递不同)指向对象是正确且重要的。我听过有人争论我们不应该谈论变量而应该谈论“名称”,他们有一定道理。但在我看来,“标识符”与语法/解析器太过紧密相关。 - user395760
@delnan:我同意我们应该谈论“名称”,这就是我试图通过说“标识符”来表达的。我并不是想让它与语法元素混淆。下次我会说名称。 - Neil G
显示剩余2条评论

3

不会的。将列表传递给函数在内存方面没有任何影响。Python 不会 复制该列表。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接