Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Append正在覆盖列表中的现有数据_Python_Python 2.7 - Fatal编程技术网

Python Append正在覆盖列表中的现有数据

Python Append正在覆盖列表中的现有数据,python,python-2.7,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(s

我有一个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']]
列表的第一个元素被覆盖。为什么会发生这种情况?

您必须将堆栈复制到var_全局,而不是附加引用

var_gobal.append(stack.copy())
堆栈在第二个元素之后将有2个元素,该元素保存在堆栈列表中


您可以使用slice
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
在通过
my\u list
的每次迭代中都被追加到
global\u var
,但在每次追加时,对
tmp
的所有引用(或所有指向的引用)都被更改。相反,如果使用了
切片
+
,则会创建新列表,其中所有元素都位于第一个元素中,因为使用了
[:]

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

for i in my_list:
    tmp = tmp[:] + [i]
    global_var.append(tmp)

global_var

这一结果:
['a'],['a','b']

不应该
global var\u global
在循环之外吗?相同的输出没有任何区别。这会产生一个错误
AttributeError:'list'对象没有属性“copy”
@pratekgupta\Patrik您是对的,但您必须编写
var\u gobal.append(copy(stack))
@PrateekGupta
list.copy()
可从python3.3Cleanest solution imo获得。这是可行的,但为什么
stack.append()
会导致问题?与上述情况类似,最初堆栈会附加
['abc']
并附加到
global\u var
。但在下一次迭代中,相同的堆栈追加了
def
,并成为
['abc','def']
。当我们附加这个更新的
堆栈
时,使用的
堆栈
的所有位置现在都将具有相同的更新值(数组通过引用传递,这里的堆栈只是一个数组或列表),所以即使是以前附加的
堆栈
也会发生更改。啊,好了,现在我明白了。谢谢。这也是@open-source的答案,但是为什么我需要创建另一个列表呢?堆栈变量已经是一个列表,首先是1个元素,然后是2个元素循环,我每次都会将它附加到全局变量,为什么它不保持不变?它会在此时创建堆栈的副本。即使堆栈发生更改,堆栈的副本仍将包含以前的堆栈值。这是因为@open-source在commentsIt中提供的原因在此时创建了堆栈的副本。即使堆栈发生更改,堆栈的副本仍将包含以前的堆栈值。这是因为@open-source在commentsYeah中提供的原因,谢谢你的解释,你的答案也是书面的,但我只能接受一个。@pratekgupta:酷
my_list = ['a', 'b']
tmp = []
global_var = [] 

for i in my_list:
    tmp = tmp[:] + [i]
    global_var.append(tmp)

global_var