我的任务是将一些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的情况。
答案 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]