gpt4 book ai didi

python [:] notation and range

转载 作者:行者123 更新时间:2023-11-28 19:49:21 26 4
gpt4 key购买 nike

我的任务是将一些 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com