2016-11-01 1 views
1

Ich habe ein seltsames Problem mit Julia, arbeiten mit DataArrays.DataArray.Lokaler Bereich und DataArrays.DataArray

Ich versuche, mein Problem mit einem Beispiel (vereinfacht) von der offiziellen Dokumentation zu beschreiben:

x = 1 
function bar() 
    x = 10 # local 
    println(x) # 10 
    return 1 
end 

bar(); 
println(x) # 1 

Diese Funktion des lokalen Wert von x ändert, aber er ändert nicht seinen globalen Wert.

Nun lassen Sie uns sagen, ich habe folgendes:

using DataFrames; 
x = @data([1 2 3 4 5 6 7 8 9 10]); 
function bar() 
    x[1,1] = 1000000 # local 
    println(x[1, 1]) # 1000000 
    return 1 
end 

bar(); 
println(x[1, 1]) # it should be 1, but it is 1000000 

Könnten Sie bitte erklären, warum dies der Fall ist und wie kann ich Julia normal verhalten lassen?

Antwort

5

Im zweiten Beispiel indexieren Sie in eine Variable und suchen daher im globalen Bereich nach ihr und mutieren sie, wenn sie da ist. h. für x [1,1], um etwas gleich zu sein, muss x bereits existieren.

Im ersten Beispiel haben Sie wie erwartet eine neue Variable im lokalen Bereich erstellt.

Macht das Sinn? Zu Ihrer Information: Dies hängt nicht mit dem DataFrames-Typ zusammen und dasselbe gilt für ein normales Array.

+0

In Ordnung, ich habe es. Ich bin immer noch in Zweifeln, da ich das gleiche Problem habe, auch wenn ich Bar als Argument akzeptiere. In diesem Fall sollte die Funktionsleiste eine lokale Version von x haben, oder? Warum greift es immer noch auf das globale x zu? – merch

+1

nein, Funktionen können ihre Argumente mutieren. Wenn du explizit eine lokale Version erstellen willst, dann füge lokal local hinzu, also 'local x =" was auch immer "' –

+0

Ok, danke für deine Hilfe! – merch