Python的:为什么当我没有真正改变它在我的名单变化?(Python: why does my l

2019-06-17 18:25发布

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

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.remove() 我甚至不能确定使用什么搜索词来弄明白。

Answer 1:

这是因为这两个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]

如果你真的想创建的副本list ,使得list2并不是指原来的名单,但名单的副本,请使用切片运算符:

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'>


Answer 2:

出现这种情况的原因可以在这里找到:

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

第二个声明“指出” mlist2mlist (即,它们都指向同一个列表对象),你对其中一个的任何变化也反映在其他。

为了使一个副本,而不是尝试这种(使用切片操作):

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

如果你是好奇切片标志,这太问题Python列表(切片法)会给你更多的背景。

最后 ,不要用一个好主意list作为标识符的Python已使用此标识为它自己的数据结构(这是我添加了“的理由m的变量名称前面的”)



文章来源: Python: why does my list change when I'm not actually changing it?