2016-06-30 45 views
2

我想要做一个函数的一些列表修改,然后继续调用该函数,这是更好的方法来做到这一点后,使用修改后的列表:我应该明确地从函数返回列表吗?

def modify(alist): 
    alist.append(4) 
alist = [1,2,3] 
modify(alist) 
alist.append(5) 

或者这样:

def modify(alist): 
    alist.append(4) 
    return alist 
alist = [1,2,3] 
alist = modify(alist) 
alist.append(5) 

是第一种坏音吗?

+0

取决于您的“更好”的标准以及如何确定代码的“语调”。 –

+1

不,第一个很好 - Python函数改变可变参数的状态,通常是'返回None'(显式或隐式) - *就像'.append'本身!* – jonrsharpe

+0

类似于http://stackoverflow.com/问题/ 26027694 /正确的样式为python-functions-that-mutate-the-argument – Deca

回答

0

从函数返回列表是安全的!

+0

非常感谢@Jack! –

0

由于您正在修改列表inplace,因此返回已修改的相同列表没有多大意义。

就地突变传播从参考list,所以最好还是离开了return声明,如果一个地方在函数中发生错误引发异常,但不return修改的对象。

应该有一个 - 最好只有一个 - 明显的方法来做到这一点。

+1

您不应该*“返回指示突变状态的值”* - 如果操作失败,引发异常。 – jonrsharpe

+0

@jonrsharpe Brainfart。没有注意。谢谢! –

1

通常功能应该返回它生成的结果。然而,当你通过一个列表,你需要做一个拷贝的列表或接受它将被修改的事实;返回修改后的列表是多余的。如果您提供默认参数,它也会导致问题,因为默认值也会被修改。

我通常更喜欢使参数只读,除非很明显他们将被修改就地。

我的建议:

def modify(alist=[]): 
    alist = alist[:] # make a copy 
    alist.append(4) 
    return alist 
-1

从形式上看,这两种方法fullfil希望任务 - 修改列表。

但是,函数return存储在变量中的某些值的第二种方法更安全,而且这样的代码更易于维护和开发,特别是如果您有许多要修改的列表时。或者通常你有一个代码解决了一些困难的任务,为此你需要很多的功能和变量。 “安全”意味着您不必担心代码中的变量名称冲突 - 您在函数名称空间内创建的所有内容都保持本地化(除了创建类属性时的情况)。所以,这通常被认为是一种更好的做法。祝你好运!

+0

羽绒选民,想解释一下吗?我的推理有什么问题吗?然后,Plaese正确。 –

相关问题