这是啥意思?
Posted
技术标签:
【中文标题】这是啥意思?【英文标题】:What does [:] mean?这是什么意思? 【发布时间】:2011-09-04 06:22:02 【问题描述】:我正在分析一些 Python 代码,但我不知道是什么
pop = population[:]
的意思。它是像 Java 中的数组列表还是像二维数组?
【问题讨论】:
相关,清除列表只能通过执行 del pop[:] 或 pop[:] = [],而不是 pop.clear() ..(就像使用 dicts 一样)。跨度> 对 Python 切片的良好 SO 讨论:***.com/questions/509211/… @Macke:注意:从 Python 3.3 开始,list
s 确实提供了clear
和copy
方法,相当于分别执行del mylist[:]
或mylist[:]
。一般来说,可变序列不需要它们,因此如果您可能收到任意可变序列,您会希望坚持基于切片的操作,但命名方法至少在 list
上可用。
@ShadowRanger 是的,9 年后。 :-)
【参考方案1】:
这是一个切片符号的示例,它的作用取决于population
的类型。如果population
是一个列表,则此行将创建列表的shallow copy。对于tuple
或str
类型的对象,它什么也不做(如果没有[:]
,该行也会做同样的事情),对于(比如说)NumPy 数组,它将为相同的数据创建一个新视图.
【讨论】:
以防万一:切片返回浅拷贝。 @ilius:也许l.copy()
可读性更强,但它不起作用。
list(l)
始终有效,更具可读性,并且即使使用 numpy.array
之类的内容也可以保证返回副本
@Eli:是的,在 list.clear()
旁边。但是,这将需要一些时间,直到这将导致此类关于 SO 的问题显着减少。 :)
@MichaelGraczyk:我假设您在这里谈论的是 NumPy 数组。而不是使用A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)]
,我几乎总是更喜欢numpy.rollaxis(A, axis, 0)[k]
。一般来说,我很少遇到需要直接创建slice()
对象的用例。如果您仍然需要它们,NumPy 会提供 s_
帮助器作为创建它们的替代方法。【参考方案2】:
了解列表切片通常会复制列表的一部分也可能会有所帮助。例如。 population[2:4]
将返回一个包含人口[2] 和人口[3] 的列表(切片是右排他的)。撇开左右索引,如population[:]
,它们分别默认为 0 和长度(人口),从而选择整个列表。因此,这是制作列表副本的常用习语。
【讨论】:
【参考方案3】:嗯...这真的取决于上下文。最终,它将slice
对象(slice(None,None,None)
) 传递给以下方法之一:__getitem__
、__setitem__
或__delitem__
。 (实际上,如果对象有__getslice__
,将使用它而不是__getitem__
,但现在已弃用且不应使用)。
对象可以对切片做他们想做的事。
在以下情况下:
x = obj[:]
这将调用obj.__getitem__
,并传入切片对象。实际上,这完全等价于:
x = obj[slice(None,None,None)]
(虽然前者可能更高效,因为它不必查找slice
构造函数——这一切都以字节码完成)。
对于大多数对象,这是一种创建序列一部分的浅拷贝的方法。
下一步:
x[:] = obj
是一种基于obj
设置项目的方法(它调用__setitem__
)。
而且,我想你可能猜到了什么:
del x[:]
调用 ;-)。
你也可以传递不同的切片:
x[1:4]
构造slice(1,4,None)
x[::-1]
构造slice(None,None,-1)
等等。延伸阅读:Explain Python's slice notation
【讨论】:
【参考方案4】:从序列的开头到结尾是一个slice,通常产生一个浅拷贝。
(嗯,它是more than that,但你还不需要关心。)
【讨论】:
【参考方案5】:它会创建列表的副本,而不是为现有列表分配一个新名称。
【讨论】:
【参考方案6】:[:] 用于数组中的限制器或切片,散列 例如: [1:5] 用于显示介于 1 和 5 之间的值,即 1-4 [开始:结束] 基本用于数组切片,理解括号接受变量,表示要显示的平均值或键,“:”用于将整个数组限制或切片成数据包。
【讨论】:
没有理由提出这样一个老问题,它已经有 5 个类似的答案,甚至是一个已被接受的答案......此外,a[1:5]
返回元素 1-4,而不是 2-4。
@SkamahOne 哦,我不知道。也许不是在这种情况下,但有时提出死问题可能是有价值的。不同的见解,不同的措辞等。在这种情况下,您纠正了答案,他们希望也能学到一些东西。以上是关于这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章