2012-08-02 41 views
3

我想将一个C应用程序移植到Python,并且有很多指针。这些是平等的:Python中的C风格指针,这是正确的吗?

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[] 
+2

谷歌搜索'蟒蛇pointer' - 第二届结果:http://mail.python.org/pipermail/edu-sig/2008-May/008531.html – SeanC 2012-08-02 18:42:47

+0

@SeanCheshire:你有一个很好的解释。这是另一个[其他语言有变量,Python有名字](http:// python。net /〜goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables)(这次有图片) – jfs 2012-08-02 21:28:02

回答

2

也许这样的事情:

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] 

这将重新绑定名称positionself.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;你可以使用“视图”来获取对列表的一部分的引用。你可能想看看,特别是如果你正在处理非常大的数组或矩阵。

View onto a numpy array?

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] 
相关问题