python - Python 中的 C 风格指针,这是正确的吗?

标签 python c pointers

我正在尝试将 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 ”来获取对列表的一部分的引用。您可能需要研究一下,尤其是当您使用非常大的数组或矩阵时。

View onto a numpy array?

关于python - Python 中的 C 风格指针,这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11783645/

相关文章:

python - 我们如何使用http请求创建dataproc集群,但出现错误预期的OAuth 2访问 token ,

python - 如何将 feature_names_out 与 scikit 的 FunctionTransformer 一起使用

c++ - 将指针地址从二维数组转移到结构

python - 如何根据另一列替换 numpy 数组中的值?

python - wxpython中的多行复选框

c - 这个 fork() 代码如何创建五个进程?

c - 使用从 C 扩展返回的文件描述符来读取 python 中的文件

c - 未初始化的值 - if_nan 函数

带有 ref/指针参数的 C# 反射调用方法

c++ - 将指针地址更改为另一个对象