Verfasst: Freitag 21. November 2008, 10:20
@Darii: Ich schreib den "Stern" immer zum Namen weil sonst so etwas wie ``int* foo, bar;`` (noch) leichter falsch verstanden werden kann.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Mal generell:numerix hat geschrieben:Wäre nett, wenn mir jemand folgendes Verhalten erklären könnte.
Code: Alles auswählen
# counter.py n = 0 def count(): global n n += 1
Liefert wie erwartet erst 0 und dann 1.Code: Alles auswählen
import counter print counter.n counter.count() print counter.n
Liefert - für mich unerwartet - beidesmal 0.Code: Alles auswählen
from counter import * print n count() print n
Code: Alles auswählen
import counter
from counter import *
print n
count()
n = counter.n
print n
Code: Alles auswählen
### counter.py
n = [0]
def count():
global n
n[0] += 1
###
from counter import *
print n[0]
count()
print n[0]
Code: Alles auswählen
link [-s]
Das stimmt zwar, ist aber leicht verwirrend, da du ja kein Objekt ohne Bezeichner schreiben kannst, es sei denn, es wird durch eine Aktion (Aufrufen, mehrere Objekte bauen irgendwas, was auch immer) erzeugt.Steht zb. rechts auch ein Bezeichner, wird dessen Referenz verwendet, steht dort ein Objekt, wird dort eine Referenz erzeugt, indem ein neues Objekt mit neuer Referenz verwendet wird
Code: Alles auswählen
# counter.py
n = 0
def count():
global n
n += 1
Code: Alles auswählen
# test.py
from counter import *
print n
count()
print n
Ja! Genau so sehe ich das..numerix hat geschrieben: Durch den import wird im globalen Namensraum von test.py eine Referenz auf n und count im Modul counter.py angelegt, d.h. zwei die Namen n und count werden an diese beiden Objekte aus counter.py gebunden. Beim Aufruf von count() wird also das Objekt count aus counter.py aufgerufen. Im lokalen Namensraum von count() wird der Bezeichner n als globaler Bezeichner (des Moduls counter.py) deklariert und damit die Möglichkeit eröffnet, an den globalen Bezeichner n innerhalb des lokalen Namensraums von count() ein neues Objekt zu binden. Genau dies geschieht dann durch die Zuweisung "n+=1": Der Name n wird neu an ein Objekt gebunden (und nicht der Wert des Objekts um 1 erhöht!). Ab diesem Zeitpunkt ist das n in counter.py nicht mehr das n in test.py, welches nämlich nach wie vor an das gleiche Objekt (nämlich die 0) gebunden ist.
Richtig?
Kannst du mir erklären, was für eine Logik dahintersteckt?BlackJack hat geschrieben:@Darii: Ich schreib den "Stern" immer zum Namen weil sonst so etwas wie ``int* foo, bar;`` (noch) leichter falsch verstanden werden kann.
Ja hast du danke. Ich dachte, dass das * zum Typ gehört(wie es eigentlich auch naheliegend und konsequent wäre).BlackJack hat geschrieben:Ich weiss nicht ob ich die Frage richtig verstehe.
Code: Alles auswählen
int **foo = new int* // Bei new gehört das Sternchen auf einmal zum Typ
Kommt doch aufs selbe hinausLeonidas hat geschrieben:Seit wann hat C ein ``new``?
Code: Alles auswählen
int **foo = malloc(sizeof(int*))