我正在使用python 3.4.2
def change(list_3,n):
list_3[n] = 'x'
return list_3
def simulate(list_2):
list_4 = []
for i in range(len(list_2)):
list_4.append(change(list_2,i))
return list_4
list_1 = [' ',' ']
simulate(list_1)
当我运行此代码时,我希望它返回:[['x',' '],[' ','x']]
但它返回[['x','x'],['x','x']]
并将list_1更改为['x','x']
。这似乎是因为函数更改接收到一个指针,使其编辑list_1。并且它还返回一个指针,当list_1发生更改时,该指针会导致list_4自行更新。
有谁知道如何让python传输列表中的实际内容而不是指针?
答案 0 :(得分:0)
不要将列表视为指针,将其视为对象。这个对象是可变的。 Python不会将新对象创建为副作用(在您的命名空间中),因此任何新对象都必须在具有赋值的行上,例如, <{1}}或=
某处。
在您的问题中,您调用return
,并返回相同的列表。如果您返回了重复内容(例如list_3[n] = 'x'
或list(list_3)
),那么您会看到您的期望。
进一步详细说明 - 考虑重新编写代码如下(展平函数,添加打印):
list_3[:]
基本上,从函数返回值的事实并不意味着您获得了新副本。此外,由于list_1 = [' ',' ']
list_4 = []
list_1[0] = 'x'
list_4.append(list_1)
list_1[1] = 'x'
list_4.append(list_1)
print list_4
未创建副本,因此append
的所有引用都会使用行list_1
进行更新。
答案 1 :(得分:0)
这是因为列表是可变的。如果数据类型是可变的,python传递地址指针,因为你将x添加到同一个列表中,list4也包含所有索引中的相同列表。
更改逻辑或使用像元组
这样的不可变数据类型答案 2 :(得分:0)
def change(list_3,n):
list_3[n] = 'x'
return list_3
def simulate(list_2):
list_4 = []
for i in range(len(list_2)):
list_4.append(change(list(list_2), i)) # this is where I've made my change. I've added the list keyword so that instead of appending the variable name "list_1", the items in list_1 are appended into list_4
return list_4
list_1 = [' ', ' ']
print(simulate(list_1))