【问题标题】:How to prevent a list from changing after being used as parameter in function?如何防止列表在函数中用作参数后发生变化?
【发布时间】:2016-02-23 16:26:35
【问题描述】:

我有一段代码没有按我的意愿输出结果。

代码

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']

【问题讨论】:

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


    【解决方案1】:

    您必须创建列表的副本,并对其进行修改:

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

    您也可以保持func_a 不变,只需调用它并提供一份列表副本:

    list_2 = func_a(list_1[:])
    

    【讨论】:

      【解决方案2】:

      你需要传递一个列表的副本来实现你想要的:

      list_2 = func_a(list_1[:])
      

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

      【讨论】:

        【解决方案3】:

        应该注意,按照建议(在函数 func_a 或对 func_a 的调用中)制作 shallow 副本只会阻止更改到顶级列表,而不是可变列表元素的组件:

        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']
        

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

        import copy
        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(copy.deepcopy(list_1))
            print(list_1)
            print("\n")
            print(list_2)
        main()
        
        [{'a': 1}, {'b': 2}, {'c': 3}]
        
        
        [{'a': 333}, {'b': 2}, {'c': 3}, 'dada']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-24
          • 1970-01-01
          相关资源
          最近更新 更多