追加是覆盖列表中的现有数据

时间:2017-03-22 14:51:58

标签: python python-2.7

我有一个python程序,它应该将列表附加到全局变量,但不是附加它而是覆盖列表。这是我制作的演示函数,它以相同的方式工作:

var_gobal = []

def parse(list_parse,stack):
    for element in list_parse:
        stack.append(element["a"])
        print(stack)
        global var_gobal
        var_gobal.append(stack)

to_parse = [{"a":"abc","b":"bcd","c":"cde"},{"a":"def","b":"efg","c":"ghi"}]
parse(to_parse,[])
print (var_gobal)

预期输出应为

[['abc'], ['abc', 'def']]

但我得到了

[['abc', 'def'], ['abc', 'def']]

列表的第一个元素被覆盖。为什么会这样?

3 个答案:

答案 0 :(得分:4)

您必须将堆栈复制到 var_global ,而不是附加参考。

var_gobal.append(stack.copy())

答案 1 :(得分:2)

  

堆栈将在第二个后面有2个元素,它被保存在堆栈列表中。

var_gobal = []

def parse(list_parse,stack):
    for element in list_parse:
        stack.append(element["a"])
        print(stack)
        new_stack = list(stack)
        var_gobal.append(new_stack)


to_parse = [{"a":"abc","b":"bcd","c":"cde"},{"a":"def","b":"efg","c":"ghi"}]
parse(to_parse,[])
print (var_gobal)

>>> print (var_gobal)
[['abc'], ['abc', 'def']]

答案 2 :(得分:2)

您可以使用切片stack = stack[:] + [element["a"]]代替列表的append方法:

var_gobal = []

def parse(list_parse,stack):
    global var_gobal

    for element in list_parse:
        stack = stack[:] + [element["a"]]
        print(stack)
        var_gobal.append(stack)

to_parse = [{"a":"abc","b":"bcd","c":"cde"},{"a":"def","b":"efg","c":"ghi"}]
parse(to_parse,[])
print (var_gobal)

输出:

['abc']
['abc', 'def']
[['abc'], ['abc', 'def']]

或者,使用stack = stack + [element["a"]]也会得到相同的结果。

为了看到差异,我们可以看到以下示例:

my_list = ['a', 'b']
tmp = []
global_var = [] 

for i in my_list:
    tmp.append(i)
    global_var.append(tmp)

global_var

这会将global_var输出为[['a', 'b'], ['a', 'b']]

尽管tmpglobal_var的每次迭代中附加到my_list,但在每个附加内容都引用(或指向的所有内容)到{{ 1}}已更改。相反,如果使用tmpslice,则会在使用+之后创建包含所有元素的新列表:

[:]

结果:my_list = ['a', 'b'] tmp = [] global_var = [] for i in my_list: tmp = tmp[:] + [i] global_var.append(tmp) global_var

相关问题