2016-07-16 17 views
2

Ich habe eine Cython Datei test.pyx mit dem folgenden Code genannt:Liste Konvertieren von Python verkohlen macht ** und wieder alle Elemente die gleiche in Cython

from libc.stdlib cimport malloc, free 
def test(): 
    x = ["a1", "a2", "a3"] 
    cdef char** y = <char**> malloc(len(x) * sizeof(char*)) 
    for i in range(len(x)): 
     item_uni = x[i].encode("UTF-8") 
     y[i] = item_uni 
    z = [] 
    for i in range(len(x)): 
     item = y[i] 
     z.append(item) 
    print(z) 

Die Funktion scheinbar ["a1", "a2", "a3"] gedruckt werden soll. Aber es gibt mir drei Instanzen von "a3" statt:

>>> test() 
[b'a3', b'a3', b'a3'] 

Warum ist das passiert?

Antwort

2

Es ist, weil temporäre Objekte beteiligt sind. item_uni hat wahrscheinlich immer die gleiche Speicheradresse für seinen Inhalt, y[i] = item_uni wird dann auf die gleiche Adresse für alle Elemente zeigen, und da die letzte Zeichenfolge "a3" ist, wird es dreimal "a3" sein.

strdup sollte es beheben (free ist für diejenigen, dann benötigt)

from libc.string cimport strdup 
...  
     y[i] = strdup(item_uni) 
+0

Dank es hat funktioniert! Kannst du ein bisschen genauer erklären, auf was kostenlos angewendet werden soll? – Alex

+1

@AlexanderWhatley In diesem Fall 'free (y [i])' nach 'z.append (item)' innerhalb der Schleife, und auch 'free (y)' nach 'print (z)'. –