Pet*_*r S 32 python list notation shallow-copy slice
我有时会遇到这种打印或返回列表的方式 - someList[:].我不明白为什么人们会使用它,因为它返回完整列表.
为什么不简单地写someList,没有[:]部分?
Fre*_*abe 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]
Run Code Online (Sandbox Code Playgroud)
请注意如何追加b1附加值a.b2然而a,附加没有修改,即b2是副本.
Spi*_*ine 16
在python中,当你这样做时a = b,a不取b 的值,而是引用 b 引用的相同值.要看到这个,请:
>>> a = {'Test': 42}
>>> b = a
>>> b['Test'] = 24
Run Code Online (Sandbox Code Playgroud)
什么是现在的价值?
>>> a['Test']
24
Run Code Online (Sandbox Code Playgroud)
它与列表类似,因此我们必须找到一种方法来真正复制列表,而不是引用它.一种方法是重新创建列表copy = list(list1),或使用copy模块的功能.但是,毕竟,最简单的方法,最漂亮,最好的方式(;),这样做,就是将第一个列表的每个值复制到另一个列表中copy = list1[:].它使用切片,这里list1从索引0切换到索引len(list1),所以返回整个list1!
而且,slice方法稍快一些:使用time.clock()方法测量1000个列表的平均执行时间,每个列表包含10000个随机整数,带有切片,构造函数和深度复制,结果表明切片是比构造函数方法快15%,深度复制慢4倍.但是,使用小列表时,这种时间的增加可以忽略不计:因此,使用copy = list(list_to_copy)或copy = list_to_copy[:]取决于开发人员的偏好.
最后,我们经常忘记list.copy方法,这似乎更快!事实上,它甚至比切片方法快13%!
要创建一个副本通过参考列表,而不是传球,为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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2555 次 |
| 最近记录: |