python [:] notation and range

标签 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 方面发生了什么。

最佳答案

这称为“切片”。请参阅 Strings 上的教程部分和列表以很好地描述它是如何工作的。 (在您的示例中,它实际上是一个被切片的 ctypes 数组,而不是列表,但它们的工作方式相同。因此,为简单起见,我们来谈谈列表。)

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

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

... 获取整个列表的副本,以及:

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

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


您可能想知道这与仅使用 a 本身有何不同。不同之处在于,在第一种情况下,b = a 不会复制列表,它只是对同一列表进行另一个引用,而在第二种情况下,a = [4, 5, 6] 不会改变列表,它会重新绑定(bind) 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)[:] 是一个新的相等范围对象。这次的复制便宜了很多,但完全没有必要。

关于 python [:] notation and range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153572/

相关文章:

mysql - 如果语法错误

javascript - 动态引用类属性

python - 异步/等待 : Continuously stream data from async method

c - 如果丢弃长度数据,C 的数组语法有什么意义?

python-3.x - Python3.6向cv2处理的视频添加音频

python - 如何将其存储在 python 图形的邻接列表中?

c++ - 为什么 `const int& k = i;++i; ` 可能?

emacs - 将字符定义为单词边界

python - 使用 pytest mocker 忽略assert_has_calls中的链式调用

python - 如何在已部署的项目中禁用 Django 的管理员,但将其保留用于本地开发?