簡體   English   中英

Python中的C風格指針,這是正確的嗎?

[英]C-style pointer in Python, is this correct?

我正在嘗試將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]

這將重新綁定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 ; 並且您可以使用“views”來獲取對列表的一部分的引用。 您可能想要研究一下,特別是如果您正在使用非常大的數組或矩陣。

查看numpy陣列?

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM