我有一个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']]
列表的第一个元素被覆盖。为什么会这样?
答案 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']]
。
尽管tmp
在global_var
的每次迭代中附加到my_list
,但在每个附加内容都引用(或指向的所有内容)到{{ 1}}已更改。相反,如果使用tmp
或slice
,则会在使用+
之后创建包含所有元素的新列表:
[:]
结果:my_list = ['a', 'b']
tmp = []
global_var = []
for i in my_list:
tmp = tmp[:] + [i]
global_var.append(tmp)
global_var