auf variablen zu greifen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

wenn ich jetzt eine anzahl an variablen habe, die größer als eins ist, aber die ich nicht alle einzelnd ansprechen möchte, wenn ich sie zum Beispiel am ende meines codes auf 0 setzten möchte, wie mache ich das dann?
henridoh
User
Beiträge: 12
Registriert: Mittwoch 4. April 2018, 21:35

jan.b hat geschrieben:wenn ich jetzt eine anzahl an variablen habe, die größer als eins ist, aber die ich nicht alle einzelnd ansprechen möchte, wenn ich sie zum Beispiel am ende meines codes auf 0 setzten möchte, wie mache ich das dann?
Wie meinst du das? hast du viele Varieblen und willst sie am Ende alle zurücksetzten?
Zuletzt geändert von henridoh am Freitag 4. Mai 2018, 21:21, insgesamt 1-mal geändert.
henridoh
User
Beiträge: 12
Registriert: Mittwoch 4. April 2018, 21:35

jan.b hat geschrieben:wenn ich jetzt eine anzahl an variablen habe, die größer als eins ist, aber die ich nicht alle einzelnd ansprechen möchte, wenn ich sie zum Beispiel am ende meines codes auf 0 setzten möchte, wie mache ich das dann?
Das könntest du mit einer liste machen:

Code: Alles auswählen

a = [1,2,3,4,5,6,7,8,9,10]

for i in a:
    a[i] = 0
Eine andere Möglichkeit währe auch:

Code: Alles auswählen

a = b = c = d = e = f = g = 0
Und wenn du es öfters verwendest:

Code: Alles auswählen

def reset(anzahl, wert)
    return (wert for i in range(anzahl))
a,b,c,d,e,f,g = reset(7,0)
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

stimmt ja. die liste... die frage war dämlich von mir. danke für die antwort.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Ein anderer Ansatz ist, über entsprechende Variablen über dir() zu iterieren, dann musst du nicht jede Variable explizit angeben:

Code: Alles auswählen

>>> a = 1
>>> b = 2
>>> c = 3
>>> d = 4
>>> e = 5
>>> locals()
{'__builtins__': <module 'builtins' (built-in)>, 'd': 4, '__package__': None, 'e': 5, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, 'c': 3, 'b': 2, '__doc__': None, 'a': 1, '__spec__': None}
>>> for variable in dir():
...     if not variable.endswith('__'):
...         locals()[variable] = 0
... 
>>> del variable
{'d': 0, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, 'c': 0, '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, 'e': 0, '__spec__': None, 'b': 0, 'a': 0}
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@jan.b: man setzt ja am Ende keine Werte von Variablen, das ist sinnlos, weil die dann ja nicht mehr benutzt werden, ist ja Ende. Beschreib doch mal ausführlicher, was Du machen möchtest.

@henridoh: die for-Schleife ist nicht das, was Du machen möchtest. Im allgemeinen bekommst Du einen Indexerror, hier ist das Ergebnis auf den ersten Blick noch verwirrender:

Code: Alles auswählen

>>> a
[0, 0, 3, 0, 5, 0, 7, 0, 9, 0]
Statt die Liste mit Werten zu füllen, würde man einfach eine neue Liste erzeugen, was dann auch funktioniert:

Code: Alles auswählen

a = [0] * 10
Entsprechend ist die Funktion `reset` mit dem Generator unnötig kompliziert:

Code: Alles auswählen

a,b,c,d,e,f,g = [0] * 7
@sls: `locals` Werte zuzuweisen funktioniert nur, wenn es identisch ist mit `globals`. Außerdem würde Deine Schleife auch alle Deine Funktionen importierte Module, `variable` überschreiben. Nichts, was man machen möchte. Außerdem gilt hier im Besonderen das Zen of Python: explizit ist besser als implizit.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

ich habe jetzt zum Beispiel eine anzahl von bällen. diese bälle berühren unterschiedlich oft ein bestimmtes objekt. im code von jedem dieser bälle ist eine variable gespeichert, die mitzählt, wie oft der jeweilige ball das objekt berührt hat. am ende möchte ich jede dieser variablen wieder zurücksetzen. ich brauche eine lösung, die schneller geht, als jede variable einzeln = 0 zu setzen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@jan.b: Wenn Du aber Bälle hast, dann sind die in einer Liste gespeichert und nicht in einzelnen Variablen.

Es geht Dir um Geschwindigkeit, Du hast also ein Performance-Problem? Dann mußt Du "low-level" mit numpy arbeiten.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

Sirius3 hat geschrieben:Dann mußt Du "low-level" mit numpy arbeiten.
ich mache sowas eigentlich in der handelsüblichen shell.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das eine hat mit dem anderen nichts zu tun. numpy ist ein Python-Modul. numpy bietet eine Datentyp namens ndarray, der zwar einen homogenen Datentype als Wert voraussetzt, aber dafür deutlich schneller ist als Listen in Python.

Gruß, noisefloor
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jan.b hat geschrieben:ich habe jetzt zum Beispiel eine anzahl von bällen. diese bälle berühren unterschiedlich oft ein bestimmtes objekt. im code von jedem dieser bälle ist eine variable gespeichert, die mitzählt, wie oft der jeweilige ball das objekt berührt hat. am ende möchte ich jede dieser variablen wieder zurücksetzen. ich brauche eine lösung, die schneller geht, als jede variable einzeln = 0 zu setzen.
Merkst du dir das als Attribut auf dem Ball? Dann reicht es nicht, bloß die Werte als Liste zu speichern. Man muss sich die Ball-Objekte in der Liste merken und darauf dann einzeln die Änderung vornehmen. Also in etwa so:

Code: Alles auswählen

def make_balls(num):
    # Vermutlich ist die Erstellung komplizierter
    return [Ball() for _ in range(num)]

def reset_collisions(balls):
    for ball in balls:
        ball.collisions = 0
    # Alternativ:
    for ball in balls:
        ball.reset_collisions()
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

sls hat geschrieben:Ein anderer Ansatz ist, über entsprechende Variablen über dir() zu iterieren, dann musst du nicht jede Variable explizit angeben:
(...)
Solche Tricks sind fehleranfällig und auch häufig ein Zeichen dafür, dass man die passende Datenstruktur nicht kennt. Wenn die Objekte ungünstig im Code vorliegen, sodass z.B. keine Liste eingesetzt werden kann, dann sollte man besser durch Refactoring den vorliegenden Code anpassen und sich möglichst nicht solcher "Hacks" bedienen.
Antworten