在函数中用作参数后如何防止列表发生变化?

时间:2016-02-23 16:26:35

标签: python python-2.7 python-3.x

我有一些代码没有输出我想要的结果。

代码

def func_a(list1):
    list1.insert(2,'3')
    list1.append('c')
    return (list1)

def main():
    list_1 = ['1','2','a','b']    
    list_2 = func_a(list_1)
    print (list_1)
    print ("\n")
    print (list_2)

main()

此代码的输出是:

['1', '2', '3', 'a', 'b', 'c']


['1', '2', '3', 'a', 'b', 'c']

我希望它是:

['1', '2', 'a', 'b']


['1', '2', '3', 'a', 'b', 'c']

3 个答案:

答案 0 :(得分:4)

您必须创建列表的副本,并修改它:

def func_a(list1):
    list1copy = list1[:]
    list1copy.insert(2,'3')
    list1copy.append('c')
    return (list1copy)

您也可以保持func_a相同,只需调用并使用该列表的副本:

list_2 = func_a(list_1[:])

答案 1 :(得分:0)

您需要传递列表副本才能达到您想要的效果:

list_2 = func_a(list_1[:])

这里发生的是列表通过引用传递给函数,即其内容仅在内存中存在一次。在函数内部,您可以更改此原始列表并返回对它的引用。回到调用位置,您将相同的引用分配给另一个变量名称,但是,现在只有一个列表已被更改。

答案 2 :(得分:0)

请注意,按照建议(在函数 func_a 中或在对 func_a 的调用中)复制只能防止更改到顶层列表,而不是可变列表元素的组件:

      var hasNumber = /\d/;   
      hasNumber.test("ABC33SDF");  //true
      hasNumber.test("ABCSDF");  //false 

这里list_1的第一个元素从{'a':1}更改为{'a':333}。要完全防止对list_1进行更改,可以制作一个副本,如下所示:

def func_a(list1):
    list1.append("dada")
    list1[0]['a']=333
    return list1

def main():
    list_1 = [{'a':1},{'b':2},{'c':3}]
    list_2 = func_a(list_1[:])
    print(list_1)
    print("\n")
    print(list_2)
main()

[{'a': 333}, {'b': 2}, {'c': 3}]


[{'a': 333}, {'b': 2}, {'c': 3}, 'dada']