python列表返回指针

时间:2017-09-04 05:54:04

标签: python python-3.x

我正在使用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']。这似乎是因为函数更改接收到一个指针,使其编辑li​​st_1。并且它还返回一个指针,当list_1发生更改时,该指针会导致list_4自行更新。

有谁知道如何让python传输列表中的实际内容而不是指针?

3 个答案:

答案 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))