这种表示法对Python中的列表有什么作用:" someList [:]"?

时间:2015-04-30 09:15:00

标签: python list slice notation shallow-copy

我有时会遇到这种打印或返回列表的方式 - someList[:]。 我不明白为什么人们会使用它,因为它会返回完整列表。

为什么不简单地写someList,而不是[:]部分?

5 个答案:

答案 0 :(得分:54)

[:]创建一个切片,通常用于获取列表的一部分。如果没有给出任何最小/最大索引,它将创建整个列表的副本。这是一个演示它的Python会话:

>>> a = [1,2,3]
>>> b1 = a
>>> b2 = a[:]
>>> b1.append(50)
>>> b2.append(51)
>>> a
[1, 2, 3, 50]
>>> b1
[1, 2, 3, 50]
>>> b2
[1, 2, 3, 51]

请注意,b1的附加内容也会将值附加到a。然而,附加到b2并未修改a,即b2是副本。

答案 1 :(得分:16)

在python中,当你执行a = b时,a不会取b的,但引用 b引用的相同值。要看到这一点,请:

>>> a = {'Test': 42}
>>> b = a
>>> b['Test'] = 24

现在的价值是什么?

>>> a['Test']
24

它与列表类似,因此我们必须找到真正复制列表的方法,而不是为其创建引用。一种方法是重新创建列表copy = list(list1),或使用copy模块的功能。但是,毕竟,最简单的方法,最好的方法,最好的方式(;),这样做是通过copy = list1[:]将第一个列表的每个值复制到另一个。它使用切片,这里list1从索引0切换到索引len(list1),所以返回整个list1!

此外,切片方法稍快一些:使用time.clock()方法测量1000个列表分配的平均执行时间,每个列表包含10000个随机整数,带有切片,构造函数和深度复制,结果显示切片比构造函数方法快15%,深度复制慢4倍。但是,使用小型列表时,这段时间可以忽略不计:因此,使用copy = list(list_to_copy)copy = list_to_copy[:]取决于开发人员的偏好。

最后,我们经常忘记list.copy方法,这似乎更快!事实上,它甚至比切片方法快13%!

答案 2 :(得分:8)

创建列表的副本,而不是像Python那样通过引用传递。使用下面两个例子来理解差异。

示例:

# Passing by reference
SomeListA = [1, 2, 3]
SomeListB = [2, 3, 4]
SomeListB = SomeListA
SomeListA[2] = 5
print SomeListB
print SomeListA

# Using slice
SomeListA = [1, 2, 3]
SomeListB = [2, 3, 4]
SomeListB = SomeListA[:]
SomeListA[2] = 5
print SomeListB
print SomeListA

答案 3 :(得分:4)

当您需要修改列表并且不想更改列表并创建另一个列表时,您可以使用

y = [1,2,3]
x = y[:]

您可以对列表进行大量更改,但原点列表将在(y)中,修改后的在(x)中

答案 4 :(得分:-2)

有2份可用。 1)深拷贝2)浅拷贝。
1)深拷贝是你只需复制值
list = ['abc',123,'xyz']
list1 = copy.deepcopy(list) or list1 = list[:]

2)浅拷贝你只是参考变量
list2 = copy.copy(list) or list2 = list

当您修改list2上的内容时,它也会在引用时在列表中生效。 list1.append(456)
list2.append('789')
print "list: %s" %list
print "list1: %s" %list1
print "list2: %s" %list2
答:
list : ['abc',123,'xyz','789']
list1 : ['abc',123,'xyz',456]
list2 : ['abc',123,'xyz','789']