我的任务是将一些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
Run Code Online (Sandbox Code Playgroud)
这个逻辑对我来说并不重要,我只想弄清楚数据类型和转换为Java的情况.
这称为"切片".有关字符串和列表的详细说明,请参阅字符串和列表的教程部分.(在你的例子中,它实际上是一个ctypes被切片的数组,而不是列表,但它们的工作方式相同.所以,为简单起见,我们来谈谈列表.)
符号indexes[:]是整个列表的一部分.所以,你可以这样做:
a = [1, 2, 3]
b = a[:]
Run Code Online (Sandbox Code Playgroud)
...获取整个列表的副本,并且:
a[:] = [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
...替换整个列表的内容.
您可能想知道这与仅使用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]
Run Code Online (Sandbox Code Playgroud)
您可能想知道为什么有人会range(2000, 3000)[:]在作业的右侧使用.
好吧,我想知道同样的事情.
如果这是Python 2.x,range(2000, 3000)则是一个全新的列表.您将该内容替换indexes为该范围列表的内容,然后放弃对范围列表的唯一引用.没有人可能最终分享它,所以没有充分的理由去制作它的额外副本,除非你担心你的计算机有太多的CPU和太多的内存而且可能会觉得无聊.
如果这是Python 3.x,range(2000, 3000)则是智能范围对象.并且range(2000, 3000)[:]是一个新的,同等范围的对象.这次复制要便宜很多,但这完全没必要.