python [:]符号和范围

时间:2013-11-22 20:06:13

标签: python syntax

我的任务是将一些python代码转换为Java。我遇到了一些我不熟悉的符号,似乎无法找到任何信息。我猜这是我缺乏关键词。

为了简单起见,我对代码进行了清理并硬编码了一些基本值。

index_type = c_int * 1000 #size of int, basically 1000 integers?
indexes = index_type() # not entirely sure what this does
indexes[:] = range(2000, 3000)[:] # no idea
# c_int equals 4

逻辑对我来说并不重要,我只想弄清楚数据类型和转换为Java的情况。

5 个答案:

答案 0 :(得分:9)

这称为“切片”。有关其工作原理的详细说明,请参阅Strings和列表中的教程部分。 (在你的例子中,它实际上是一个被切片的ctypes数组,而不是列表,但它们的工作方式相同。所以,为简单起见,我们来谈谈列表。)

符号indexes[:]是整个列表的一部分。所以,你可以这样做:

a = [1, 2, 3]
b = a[:]

...获取整个列表的副本,并且:

a[:] = [4, 5, 6]

...替换整个列表的内容。


您可能想知道这与仅使用a本身有何不同。区别在于,在第一种情况下,b = a不复制列表,它只是对同一列表进行另一次引用,而在第二种情况下,a = [4, 5, 6]不会改变列表,它重新绑定a以引用新列表。这是一个显示差异的例子:

>>> a = [1, 2, 3]
>>> b = a           # b is now the same list as a
>>> a[0] = 10       # so changing that list is visible to b
>>> b
[10, 2, 3]

>>> a = [1, 2, 3]
>>> b = a[:]        # b is now a new list, with a copy of a
>>> a[0] = 10       # so changing the original list doesn't affect b
>>> b
[1, 2, 3]

>>> a = [1, 2, 3]
>>> b = a           # b is now the same list as a
>>> a = [4, 5]      # but now a is a different list
>>> a[0] = 10
>>> b
[1, 2, 3]

>>> a = [1, 2, 3]
>>> b = a           # b is now the same list as a
>>> a[:] = [4, 5]   # and we've replaced the contents
>>> b
[4, 5]

您可能想知道为什么有人会在作业的右侧使用range(2000, 3000)[:]

嗯,我想知道同样的事情。

如果这是Python 2.x,range(2000, 3000)是一个全新的列表。您将indexes的内容替换为该范围列表的内容,然后放弃对范围列表的唯一引用。没有人可能最终分享它,所以没有充分的理由去制作它的额外副本,除非你担心你的计算机有太多的CPU和太多的RAM而且可能会感到无聊。

如果这是Python 3.x,range(2000, 3000)是智能范围对象。 range(2000, 3000)[:]是一个新的等范围对象。这次复制要便宜得多,但这完全没必要。

答案 1 :(得分:2)

其他答案正在谈论x[:]作为表达的含义。但是当这种表示法用作作业的目标时(即在=的左侧),它意味着不同的东西。它仍然是对象的一部分,但它不会创建副本;相反,它将给定值(右侧)分配给对象的指定“部分”。如果使用[:],则切片是整个对象,因此其内容将被您传递的内容替换。

一个例子:

>>> x = [1, 2, 3]
>>> x[:] = [8, 8]
>>> x
[8, 8]

请注意,您可以使用不同长度的新内容替换内容。

如果使用部分切片,则只会替换部分内容:

>>> x = [1, 2, 3, 4]
>>> x[1:3] = [8, 8, 88]
>>> x
[1, 8, 8, 88, 4]

答案 2 :(得分:0)

符号:

[a:b]

范围是从a开始,到b结束。如果将其中一个留空,则分别计为“开始”和“结束”。

基本上,您的indexes是一个值列表,每个值都有一个与之关联的数字,显示其在indexes内的顺序。它从0开始,一直持续到结束。代码行:

indexes[:]

简单地说就是

"first value of indexes to last value of indexes"

我希望这有帮助, 快乐的编码!

答案 3 :(得分:0)

这意味着获取原始列表的 COPY ,因为列表在python中是可变的,例如

>>a = [1,2,3]
>>b = a
>>a[0] = 3
>>a
[3, 2, 3]
>>b
[3, 2, 3]
>>b = a[:]
>>a[0] = 0
>>a
[0, 2, 3]
>>b
[3, 2, 3]

答案 4 :(得分:0)

[:]是切片表示法的一个示例,Python用于指定序列中任意数量的项目。 [:]指定整个序列。符号简洁而有力,可以表达。其他一些可能的形式是:

sequence[n]    #an index to one item (not a slice)
sequence[n:]   #the nth item to the end of the sequence
sequence[:n]   #all items until the nth item (exclusive)
sequence[m:n]  #the mth item until the nth item (exclusive)
sequence[:]    #all items
sequence[::2]  #every other item
sequence[::-1] #all items in reverse order

当切片用于修改序列中的项目时,项目将被修改:

>>> a = [1, 2, 3]
>>> a[0:1] = [4]  #same as a[0] = 4
>>> a
[4, 2, 3]
>>> a[:] = [1, 2, 3, 4] #the sequence can be made larger
>>> a
[1, 2, 3, 4]

>>> a[:] = [] #or smaller
>>> a
[]

当切片用于读取序列中的项目时,将返回项目的浅表副本而不是对项目的引用。术语浅拷贝意味着如果复制的项本身就是一个序列,该项将引用原始序列,而不是它的副本:

例如:

>>> a = [1, 2, 3]
>>> b = a[0]
>>> b  #b has the same value as, but does not reference the same object as a[0]
1  #this is a copy of a[0]

>>> a = [1, 2, 3]
>>> b = a[:]
>>> b  #b has the same values as, but does not reference the same object as a
[1, 2, 3]  #this is a copy of list a

>>> a = [1, 2, 3]
>>> b = [a, 2, 3]
>>> c = b[:] #c is a hallow copy of b
>>> c
[[1, 2, 3], 2, 3]
>>> b[:] = [] # modifying b does not affect c
>>> c
[[1, 2, 3], 2, 3]
>>> a[0] = 4 # modifying a will affect a in c
>>> c
[[4, 2, 3], 2, 3]