【发布时间】:2019-12-13 04:42:03
【问题描述】:
我最近发现python中的列表是通过引用自动传递的(除非使用了表示法array[:])。例如,这两个函数做同样的事情:
def foo(z):
z.append(3)
def bar(z):
z.append(3)
return z
x = [1, 2]
y = [1, 2]
foo(x)
bar(y)
print(x, y)
在此之前,我总是返回我操作过的数组,因为我认为我必须这样做。现在,我知道它是多余的(也许效率低下),但似乎返回值通常是代码可读性的好习惯。我的问题是,执行这两种方法是否有任何问题/最佳实践是什么?我缺少第三种选择吗?很抱歉,如果以前有人问过这个问题,但我找不到任何能真正回答我问题的东西。
【问题讨论】:
-
"通过引用自动传递" 从技术上讲这是不正确的。 Python 使用引用的副本来传递事物。这些引用可能指向可变或不可变对象,这就是混淆的来源。见stupidpythonideas.blogspot.com/2013/11/…
-
@DeepSpace。那,“按引用”和“按值”根本不是唯一可用的选项。
-
“pythonic”方式——如果你正在编写一个改变
list的函数——就是不返回任何东西(除非你有很好的理由这样做)。相反,在函数文档字符串中特别说明该函数修改了list。此外,python 既不是通过值也不是通过引用传递对象,您需要read this article。 -
这只是一个玩具示例,还是您实际上正在编写一个修改
list的函数?如果是这样,你为什么认为你需要这样做? -
@RickTeachey。这只是一个玩具示例,但我确实编写了修改列表的函数。据我所知,可以 1. 修改函数中的列表(在阅读了此处的答案后,为了便于阅读,它永远也不应该返回),或者 2. 创建列表的副本并将其返回。我听说前者是一种更便宜的操作,这让我认为在大多数情况下它会更好。
标签: python pass-by-reference pass-by-value