3

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[]
4

2 に答える 2

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動的ではない a を定義できることに注意してください。また、「ビュー」を使用して、リストの一部だけへの参照を取得できます。特に、非常に大きな配列や行列を扱っている場合は、これを調べてみてください。

numpy 配列を表示しますか?

于 2012-08-02T20:56:50.717 に答える
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]
于 2012-08-02T21:27:31.940 に答える