新手有问题,所以请温柔:
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()
我甚至不能确定使用什么搜索词来弄明白。
这是因为这两个list
和list2
指的是同一个列表,你做了分配后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'>
出现这种情况的原因可以在这里找到:
mlist = [1,2,3,4,5]
mlist2 = mlist
第二个声明“指出” mlist2
到mlist
(即,它们都指向同一个列表对象),你对其中一个的任何变化也反映在其他。
为了使一个副本,而不是尝试这种(使用切片操作):
mlist = [1,2,3,4,5]
mlist2 = mlist[:]
如果你是好奇切片标志,这太问题Python列表(切片法)会给你更多的背景。
最后 ,不要用一个好主意list
作为标识符的Python已使用此标识为它自己的数据结构(这是我添加了“的理由m
的变量名称前面的”)