Python:为什么我的列表在我实际上没有改变时会改变?

use*_*149 5 python alias list

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

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)
Run Code Online (Sandbox Code Playgroud)

这导致:

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]
Run Code Online (Sandbox Code Playgroud)

我不明白为什么列表在我做的时候正在改变list2.remove(),而不是list.remove().我甚至不确定用什么搜索词来弄明白.

Lev*_*von 14

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

mlist = [1,2,3,4,5]
mlist2 = mlist
Run Code Online (Sandbox Code Playgroud)

第二条语句"点" mlist2mlist(即,它们都指的是同一个列表对象),你对其中一个的任何变化也反映在其他.

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

mlist = [1,2,3,4,5]
mlist2 = mlist[:]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 真棒!我模糊地回忆起关于指向同一个对象的变量的阅读,并想知道所有大惊小怪的是什么.现在我知道了. (2认同)

Sus*_*Pal 6

这是因为两者listlist2指的是同一个列表,你做了分配之后list2=list.

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

id(list)
id(list2)
Run Code Online (Sandbox Code Playgroud)

一个例子:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

如果你真的想创建的副本list,从而list2不会指向原始清单,但清单的副本,请使用切片运算符:

list2 = list[:]
Run Code Online (Sandbox Code Playgroud)

一个例子:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

另外,不要使用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'>
Run Code Online (Sandbox Code Playgroud)