我正在尝试将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[]
答案 0 :(得分:3)
也许是这样的:
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]
这会重新绑定position
对象中的名称self.comps[N]
,现在指向一个值为[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
;并且您可以使用“views”来获取对列表的一部分的引用。您可能希望研究这一点,特别是如果您正在使用非常大的数组或矩阵。
答案 1 :(得分:1)
self.comps [N] .position = [1,2,3,4]
将self.comps [N] .position设置为新列表。如果对旧列表的其他引用是self.comps [N] .position,则不会更改它们。
实施例
x=[1,2,3]
y=x
print y #[1, 2, 3]
x[1]=4
print y #[1, 4, 3]
x=[4,5,6]
print y #[1, 4, 3]