我有一些代码没有输出我想要的结果。
代码
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']
答案 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']