python中list和list [:]有什么区别?
python中的list和list[:]之间的区别是什么?
Jing asked 2020-02-04T07:22:15Z
7个解决方案
73 votes
阅读时,list是对原始列表的引用,并且list[:]浅表复制了该列表。
分配时,list(重新)绑定名称和list[:]切片分配,替换列表中以前的名称。
另外,请勿使用list作为名称,因为它会掩盖内置文件。
Ignacio Vazquez-Abrams answered 2020-02-04T07:22:39Z
22 votes
后者是对列表副本的引用,而不是对列表的引用。 因此,它非常有用。
>>> li = [1,2,3]
>>> li2 = li
>>> li3 = li[:]
>>> li2[0] = 0
>>> li
[0, 2, 3]
>>> li3
[1, 2, 3]
Matthew Mitchell answered 2020-02-04T07:22:59Z
3 votes
要将第一个:应用于变量,将创建对原始列表的引用。第二个list[i]将创建一个浅表副本。
例如:
foo = [1,2,3]
bar = foo
foo[0] = 4
bar和foo现在将是:
[4,2,3]
但:
foo = [1,2,3]
bar = foo[:]
foo[0] = 4
结果将是:
bar == [1,2,3]
foo == [4,2,3]
:是切片。
Glycerine answered 2020-02-04T07:23:41Z
3 votes
但是,如果列表元素是列表本身,那么即使是list1 = list[:]也会出现问题。 考虑:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 3], [4, 5, 6], [7, 8, 9]]
发生这种情况是因为复制到b的每个列表元素都是列表本身,并且列表的这种复制涉及正常for所发生的相同问题。我发现的最快捷的方法是以这种方式显式复制每个列表元素:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b=[[j for j in i] for i in a]
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
当然,对于嵌套列表中每增加一个嵌套度,复制代码就会通过附加的内联for循环加深。
Abhranil Das answered 2020-02-04T07:24:11Z
3 votes
li [:]创建原始列表的副本。 但是它没有引用相同的列表对象。 因此,您不必冒险通过更改由li [:]创建的副本来更改原始列表。
例如:
>>> list1 = [1,2,3]
>>> list2 = list1
>>> list3 = list1[:]
>>> list1[0] = 4
>>> list2
[4, 2, 3]
>>> list3
[1, 2, 3]
此处list2通过更改list1进行了更改,但list3不变。
tarashish answered 2020-02-04T07:24:41Z
2 votes
另一个有用的示例是为列表和列表[:]分配其他类型时。 例如,
l = [1,2,3]
a = numpy.array([4,5,6])
l = a
print(l)
结果是一个numpy数组:
array([4, 5, 6])
而,
l = [1,2,3]
a = numpy.array([4,5,6])
l[:] = a
print(l)
结果是一个列表:
[4, 5, 6]
Mohsen Abedin Nejad answered 2020-02-04T07:25:13Z
1 votes
第一个引用原始列表。 第二个指向原始列表的副本。
看一下这个!
>>> a = [1, 2, 3]
>>> b = a
>>> c = a[:]
>>> a == b
True
>>> a is b
True
>>> a == c
True
>>> a is c
False
>>> a.__repr__
>>> a.__repr__()
'[1, 2, 3]'
>>> b.__repr__
>>> c.__repr__
请注意,a和b都指向地址0x7f87a9ba3688,而c指向地址0x7f87ad352988。
区别很明显。
a和b都引用原始列表对象。
而c指向(原始列表的)副本,因此它位于不同的位置。
Akash Adhikari answered 2020-02-04T07:25:55Z