我最近发现python中的列表是通过引用自动传递的(除非使用了符号数组[:])。例如,这两个函数的作用相同:
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)
在此之前,我总是返回我操纵的数组,因为我认为我必须返回。现在,我明白这是多余的(也许效率很低),但返回值通常是提高代码可读性的好方法。我的问题是,做这两种方法中的任何一种都有什么问题/最佳实践是什么?有没有第三种选择我错过了?如果以前有人问过这个问题,我很抱歉,但我找不到任何真正能回答我问题的答案。你知道吗
“最佳实践”从技术上讲是完全不修改:
但总的来说,如果你限制自己返回一个新的对象或者修改一个对象,但不能同时返回和修改两个对象,那就更清楚了。你知道吗
标准库中有这样的例子,既修改了一个对象,又返回了一些东西(最重要的例子是
list.pop()
),但这是一个特例,因为它没有返回被修改的对象。你知道吗通常,Python内置不会同时执行这两个操作,以避免混淆函数/方法是就地修改其参数还是返回新值。就地修改时,不执行
return
(使其隐式返回None
)。例外情况是变异函数返回的不是变异对象(例如dict.pop
,dict.setdefault
)。你知道吗一般来说,遵循相同的模式是个好主意,以避免混淆。你知道吗
这个答案是基于这样一个假设,即已经决定是修改您的输入,还是返回一个副本。你知道吗
正如您所指出的,是否返回修改过的对象是一个意见问题,因为结果在功能上是等价的。一般来说,而不是返回修改过的列表被认为是一种好的形式。根据Zen of Python(第2项):
标准图书馆证实了这一点。列表方法为此而臭名昭著:^{}, ^{}, ^{} ,^{} ,等等
Numpy也经常使用这种模式,因为它经常处理无法复制和返回的大型数据集。一个常见的例子是数组方法^{} ,不要与返回新副本的顶级函数^{} 混淆。你知道吗
这个想法在很大程度上是Python思维方式的一部分。以下是Guido's email的摘录,解释了原因和原因:
相关问题 更多 >
编程相关推荐