Warum ist das so?
Code: Alles auswählen
>>> class foo():
def __init__(self):
self.foo = 100
>>> a = foo()
>>> b = 100
>>> def bla():
a.foo = 10
>>> def blubb():
b = 10
>>> bla()
>>> a.foo
10
>>> blubb()
>>> b
100
Code: Alles auswählen
>>> class foo():
def __init__(self):
self.foo = 100
>>> a = foo()
>>> b = 100
>>> def bla():
a.foo = 10
>>> def blubb():
b = 10
>>> bla()
>>> a.foo
10
>>> blubb()
>>> b
100
Code: Alles auswählen
>>> a, b, c = 1, 1, 1
>>> def outer():
... b = 2
... def inner():
... c = 3
... print a, b, c
... return inner
...
>>> inner = outer()
>>> inner()
1 2 3
Naja, "Verändern" ist relativ:Nocta hat geschrieben:Aber dass ich ein Objekt, welches sich eine Ebene über der Funktion befindet, innerhalb einer Funktion verändern kann, hat mich gewundert.
Code: Alles auswählen
>>> class Foo(object): pass
...
>>> foo = Foo()
>>> def modify_foo(): foo.bar = 42
...
>>> id(foo)
3077101996L
>>> hasattr(foo, 'bar')
False
>>> modify_foo()
>>> foo.bar
42
>>> id(foo)
3077101996L
Das hier ist der Punkt, wo dein Verständnis von Variablen in Python zusammenbrechen sollte Du musst dir klar machen, was snafu schon versucht hat: den Unterschied zwischen "echten" Variablen und an Namen gebundene Objekte.Nocta hat geschrieben:Naja, für mich ist das verändert
Dass es kein neues Objekt ist, ist klar, weil das anscheinend das einzige ist, was nicht geht
Code: Alles auswählen
>>> a = 100
>>> def blubb():
... global a
... a = 10
...
>>> a
100
>>> blubb()
>>> a
10
Soweit richtig.Nocta hat geschrieben: Neues Objekt an den Namen binden: Nein
An den Namen gebundenes Objekt ändern: Ja
Eigentlich ist das 'ändern können' die Regel und das 'nicht ändern können' die Ausnahme. Objekte sind in Python nämlich grundsätzlich "mutable", also veränderbar. Integer, Floats, Strings, Tupel u.s.w. sind aber explizit 'immutable', also nicht veränderbar. Dieser Begriff, der auch oft in der Dokumentation vor kommt, ist in Python ziemlich wichtig.Nocta hat geschrieben:Das werd ich dann fortan als Tatsache ansehen, mich hat es halt etwas stutzig gemacht. Dass man Objekte von außerhalb lesen kann, war mir schon bekannt und steht an mehreren Stellen im Internet (auch hier im Forum). Aber da ist irgendwie nie die Rede davon, dass man das Objekt auch ändern (also die Attribute schreiben) kann.
Die Namenräume funktionieren aber(größenteils) wie in anderen Sprachen.Nocta hat geschrieben:Okay, das leuchtet so weit ein.
Ich muss mich nur von dem Gedanken trennen, dass die Namensräume wie in anderen Sprachen funktionieren und mir deine Regel
Code: Alles auswählen
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int foo;
} foo;
foo a = { .foo = 100 };
int b = 100;
void bla() {
a.foo = 10;
}
void blubb() {
int b = 10;
}
int main() {
bla();
printf("%d\n", a.foo); // 10
blubb();
printf("%d\n", b); // 100
return EXIT_SUCCESS;
}