5

新手有问题,所以请温柔:

list = [1, 2, 3, 4, 5]
list2 = list

def fxn(list,list2):
    for number in list:
        print(number)
        print(list)
        list2.remove(number)
        print("after remove list is  ", list, " and list 2 is  ", list2)
    return list, list2

list, list2 = fxn(list, list2)
print("after fxn list is  ", list)
print("after fxn list2 is  ", list2)

这导致:

1
[1, 2, 3, 4, 5]
after remove list is   [2, 3, 4, 5]  and list 2 is   [2, 3, 4, 5]
3
[2, 3, 4, 5]
after remove list is   [2, 4, 5]  and list 2 is   [2, 4, 5]
5
[2, 4, 5]
after remove list is   [2, 4]  and list 2 is   [2, 4]
after fxn list is   [2, 4]
after fxn list2 is   [2, 4]

我不明白为什么当我只做list2.remove()而不是做时 list 会发生变化list.remove()。我什至不确定要使用什么搜索词来弄清楚。

4

2 回答 2

14

发生这种情况的原因可以在这里找到:

mlist = [1,2,3,4,5]
mlist2 = mlist

第二个语句“指向” mlist2mlist即,它们都引用同一个列表对象)并且您对其中一个所做的任何更改都会反映在另一个中。

要制作副本,请尝试以下操作(使用切片操作):

mlist = [1,2,3,4,5]
mlist2 = mlist[:]

如果您对切片表示法感到好奇,这个 SO 问题Python Lists(Slice method)将为您提供更多背景知识。

最后,作为标识符使用不是一个好主意,list因为 Python 已经将这个标识符用于它自己的数据结构(这就是我m在变量名前面添加“”的原因)

于 2012-08-16T19:11:35.483 回答
6

那是因为在你完成 assignment 之后listlist2都指的是同一个列表list2=list

试试这个,看看它们是指相同的对象还是不同的对象:

id(list)
id(list2)

一个例子:

>>> list = [1, 2, 3, 4, 5]
>>> list2 = list
>>> id(list)
140496700844944
>>> id(list2)
140496700844944
>>> list.remove(3)
>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 4, 5]

如果您确实想创建listlist2引用原始列表而是列表副本的副本,请使用切片运算符:

list2 = list[:]

一个例子:

>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 4, 5]
>>> list = [1, 2, 3, 4, 5]
>>> list2 = list[:]
>>> id(list)
140496701034792
>>> id(list2)
140496701034864
>>> list.remove(3)
>>> list
[1, 2, 4, 5]
>>> list2
[1, 2, 3, 4, 5]

另外,不要list用作变量名,因为最初list是指类型列表,但是通过定义您自己的list变量,您隐藏了list引用类型列表的原始变量。例子:

>>> list
<type 'list'>
>>> type(list)
<type 'type'>
>>> list = [1, 2, 3, 4, 5]
>>> list
[1, 2, 3, 4, 5]
>>> type(list)
<type 'list'>
于 2012-08-16T19:11:49.943 回答