此符号对 Python 中的列表有何作用:"someList[:]"?

What does this notation do for lists in Python: "someList[:]"?

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

为什么不直接写 someList,而没有 [:] 部分?

创建一个列表的副本,而不是像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

[:] 创建一个切片,通常用于获取列表的一部分。在没有给出任何 minimum/maximum 索引的情况下,它会创建整个列表的副本。这是演示它的 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 是一个副本。

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

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

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

在 python 中,当您执行 a = b 时,a 不会采用 b 的 value,而是 references b引用的相同值。要查看此内容,请:

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

现在 a 的值是多少?

>>> a['Test']
24

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

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

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

有2份可用。 1) 深拷贝 2) 浅拷贝。
1) Deep Copy就是你只是复制值
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']