我正在尝试将 C 应用程序移植到 Python,并且有很多指针。这些是否相等:
obj->position = (float*) malloc(obj->totalItems * obj->xyz * sizeof (float));
for (i = 0; i < components; i++) {
obj->comps[i].position = obj->position + obj->pOffset; // Pointer arithmetic
obj->pOffset += obj->comps[i].items * obj->xyz;
}
和
for i in range(self.totalItems * self.xyz):
self.position.append(0.0)
for i in range(self.components):
self.comps[i].position = self.position[self.pOffset:] # Position was a C pointer
self.pOffset += self.comps[i].items * self.xyz
我知道 Python 对象是通过引用传递的,所以我想知道是否:
self.comps[N].position = [1,2,3,4]
会改变一部分:
self.position[]
最佳答案
也许是这样的:
self.position = [0.0 for _ in self.total_items * self.xyz]
for i in range(self.components):
self.comps[i].position = self.p_offset
self.p_offset += self.comps[i].items
在 Python 中,您可以更改类实例变量中的值。这称为“改变”实例。如果该类不允许这样做,则它是一个“不可变”类;如果它确实允许这样做,那么它就是一个“可变”类。字符串和整数一样是不可变的,但列表是可变的。
在 Python 中,我想不出任何方法来获取对列表中间部分的引用。列表是可变的:可以插入、删除等等。那么引用应该做什么?
因此,与其进行指针数学运算并存储对列表中某个点的引用,不如存储偏移量,然后在需要引用列表中的那个点时使用偏移量为列表编制索引。
针对您的具体问题:
self.comps[N].position = [1,2,3,4]
这将重新绑定(bind) self.comps[N]
对象中的名称 position
现在指向一个新创建的列表实例,其值为 [1, 2, 3, 4]
并且根本不会影响 self.position
。但是,如果您只是将 self.comps[i].position
设置为索引值,您可以使用以下代码:
i = self.comps[N].position
lst = [1, 2, 3, 4]
self.position[i:i+len(lst)] = lst
这将在 self.position
列表中使用“切片”来替换值。
请注意,如果您使用 SciPy 或什至只使用 NumPy,您可以定义一个非动态的 numpy.array
;您可以使用“ View ”来获取对列表的一部分的引用。您可能需要研究一下,尤其是当您使用非常大的数组或矩阵时。
关于python - Python 中的 C 风格指针,这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11783645/