Python globale Variablen mit einer lokalen addieren?

moonshine07  09.12.2021, 22:08

Könntest du die Frage nochmal näher erläutern?

BlackDragon2210 
Fragesteller
 09.12.2021, 22:16

Habe eine Variable x = 1 und eine

def y:

gib anzahl von Karten in anzahl von x aus.

x += 1

und ich will einfach, dass x = 2 wird, aber wird sie leider nicht.

moonshine07  09.12.2021, 22:17

kannste mal das skript schicken?

BlackDragon2210 
Fragesteller
 09.12.2021, 22:23

https://ibb.co/nbYC955 Das ganze Skript ist relativ unübersichtlich, aber im Grunde genommen will ich nur diese Zeilen klappen lassen.

3 Antworten

Dafür könntest du theoretisch die eingebaute globals-Funktion nutzen ... https://docs.python.org/3/library/functions.html#globals

Das ganze ist auf jeden Fall schlechter Stil und sollte unterlassen werden. Allgemein sollte man globals am besten gar nicht nutzen, eben um so ein Vorhaben wie deins gleich direkt verhindert wird.

GuteAntwort2021  09.12.2021, 22:16

Globale Variablen haben eben den Sinn, dass man sie global aufrufen kann, ohne sie an jede Funktion übergeben zu müssen um auf den Rückgabewert zu warten...

Das hat nicht zwangsläufig etwas mit schlechtem Stil zu tun.

0
xxxcyberxxx  09.12.2021, 22:24
@GuteAntwort2021
Globale Variablen haben eben den Sinn, dass man sie global aufrufen kann, ohne sie an jede Funktion übergeben zu müssen um auf den Rückgabewert zu warten...

okay, um das ganze noch weiter zu konkretisieren:

globale Konstanten, die nur gelesen werden, sind okay. Wenn eine globale Variable aber sowohl gelesen als auch beschrieben werden kann, kann das eventuell zu unerwünschten Nebenwirkungen führen, die auf den ersten Blick dann eben nicht zu erklären sind.

Das ganze zählt nicht nur für Python, sondern für eigentlich alle Sprachen

Es ist eine weitere Ebene der Komplexität, die - so weit wie möglich - zu vermeiden ist.

1
GuteAntwort2021  09.12.2021, 22:59
@xxxcyberxxx
kann das eventuell zu unerwünschten Nebenwirkungen führen, die auf den ersten Blick dann eben nicht zu erklären sind.

Das stimmt, ist allerdings eine Frage der Gewöhnung. Ich benenne globale Variablen zum Beispiel entsprechend mit einem g_ vor dem Variablennamen, denn ob du es glaubst oder nicht, entstehen die meisten Fehler mit globalen Variablen bei der Namensgebung und entsprechenden Konflikten.

Es ist eine weitere Ebene der Komplexität, die - so weit wie möglich - zu vermeiden ist.

Ehm, für was hältst du das Stichwort static in Java zum Beispiel? Hat doch eine ziemliche Ähnlichkeit zu einer globalen Variable (auch wenn man sie nur lokal als statisch deklarieren kann). Oder den Konstruktor bei der Objekterzeugung?

Aber lass uns nicht darüber diskutieren ob und in wie weit globale Variablen sinnvoll sind, ich fand die Bemerkung "schlechter Stil" nur etwas überspitzt, da globale Variablen aus Grund existieren und auch genutzt werden, wenn es sinnvoll ist.

Ein Beispiel wäre eine globale Buffer-Liste zum Zwischenspeichern, statt in jeder Funktion eine neue temporäre Variable dafür erzeugen zu müssen. Im bildlichen Sinne quasi eine Art Post IT Sammlung am Bildschirm...

Ein anderes sind Runner-Variablen die zu jedem Zeitpunkt bereit auf Abruf sein müssen. Dies kann in Apps mit Eventhandling wichtig sein. Womit wir wieder beim Thema Konstruktor bei der Objektorientierung wären. ;-)

0
xxxcyberxxx  09.12.2021, 23:09
@GuteAntwort2021
Ehm, für was hältst du das Stichwort static in Java zum Beispiel?

Das deklariert ein statisches Mitglied der Klasse.

Hat doch ziemlich Ähnlichkeit zu einer globalen Variable (auch wenn man sie nur lokal als statisch deklarieren kann).

Nicht wirklich.

Oder den Konstruktor bei der Objekterzeugung?

Der Konstruktor ist eine Funktion der Klasse. Hat auch nichts mit globalen Variablen zu tun ...

Aber lass uns nicht darüber diskutieren ob und in wie weit globale Variablen sinnvoll sind, ich fand die Bemerkung " schlechter Stil" nur etwas überspitzt, da globale Variablen aus Grund existieren und auch genutzt werden, wenn es sinnvoll ist.

Ja, es gibt Sinn und Zweck davon und wenn man aufpasst, kann man das auch nutzen. Es gilt nur in vielen Sprachen als schlechter Stil. Ich lass auch einfach mal das hier da: https://stackoverflow.com/questions/19158339/why-are-global-variables-evil

Ein Beispiel wäre eine globale Buffer-Liste zum Zwischenspeichern, statt in jeder Funktion eine neue temporäre Variable erzeugen zu müssen.

Lässt sich auch ohne globale Variablen bewerkstelligen

Ein anderes sind Runner-Variablen die zu jedem Zeitpunkt bereit auf Abruf sein müssen. Dies kann in Apps mit Eventhandling wichtig sein. Womit wir wieder beim Thema Konstruktor bei der Objektorientierung wären. ;-)

und ist etwas, was nichts mit globalen Variablen zu tun hat ...

Aber ja, diese Diskussion lässt sich ewig weiterführen und da gibt es viele Ansichten und Aspekte

1
GuteAntwort2021  10.12.2021, 01:23
@xxxcyberxxx

Sorry, aber du redest wirres Zeug.

Der Konstruktor ist eine Funktion der Klasse. Hat auch nichts mit globalen Variablen zu tun

Der Konstruktor setzt die Felder (Variablen) der Klasse. Diese sind global innerhalb des Objekts (der Klasse) verfügbar, ansonsten wäre der Konstruktor sinnlos.

Das deklariert ein statisches Mitglied der Klasse.

Was bezüglich Variablen unnötig wäre (in den meisten Fällen), wenn man sie nicht global definieren wollte.

Lässt sich auch ohne globale Variablen bewerkstelligen

Sicher, in dem man praktisch bei jedem Funktionsaufruf die Variable mit übergibt. Das wird besonders spaßig wenn du aus einer Funktion heraus diverse verschachtele andere Funktionsaufrufe hast.

Effizient ist das nicht, sondern einfach nur dämlich und sehr komplex!

und ist etwas, was nichts mit globalen Variablen zu tun hat ...

Aber vergleichbar eben dazu ist.

Aber ja, diese Diskussion lässt sich ewig weiterführen und da gibt es viele Ansichten und Aspekte

Richtig. Daher würde ich deine Antwort als solches auch nicht kritisieren, weil es deine persönliche Meinung ist. Aber die Bezeichnung "schlechter Stil" ohne den Zusatz "meiner Meinung nach" stößt mir etwas auf, da globale Variablen mMn durchaus ihren Sinn haben.

Denn sonst gäbe es sie nicht... ;-)

Danke für diesen Austausch und weiterhin alles Gute!

0
BlackDragon2210 
Fragesteller
 09.12.2021, 22:18

Ich wünschte ich könnte diese Funktion benutzen, aber wie Sie schon gesagt haben ist das schlechter Stil und in meiner Uni leider verboten, deshalb suche ich nach alternativen Lösungsansätzen wie ich das Problem umgehen könnte.

0
xxxcyberxxx  09.12.2021, 22:25
@BlackDragon2210
Ich wünschte ich könnte diese Funktion benutzen, aber wie Sie schon gesagt haben ist das schlechter Stil und in meiner Uni leider verboten

aber globale Variablen sind okay? Ich nehme an, das wird dann auch problematisch sein

deshalb suche ich nach alternativen Lösungsansätzen wie ich das Problem umgehen könnte.

entweder erstellst du die Variable eben in der Funktion selbst oder übergibst sie als Parameter deiner Funktion

Um das konkret sagen zu können, sollte man jedoch den Code sehen

0
xxxcyberxxx  09.12.2021, 22:42
@BlackDragon2210
Ja globale Variablen sind in Ordnung. Den Codeabschnitt der bearbeitet werden soll ist der hier: https://ibb.co/nbYC955
  • hat es einen besonderen Grund, warum dein rounds außerhalb global sein muss? Setz doch einfach einen drittten Parameter und nutze diesen. Alternativ: Erstelle rounds in der Funktion selbst ...
  • was für einen Sinn hat es deiner Meinung, die Variable hier im inneren der Schleife zu verändern? Deine Anzahl der Handkarten ist ja schon im Voraus fest. Diesen Parameter müsstest du dann auch nichz zurückgeben, da er beim Aufrufer ja schon bekannt ist - du kannst ihn danach nochmal nutzen
  • Es hat evenutell einen anderen Effekt, als du eroffst. Deine Schleife läuft dennoch nur ein einziges Mal, da rounds beim Aufruf von range 1 war ...
0
BlackDragon2210 
Fragesteller
 10.12.2021, 00:59
@xxxcyberxxx

nein, also es ist global weil es am einfachsten für mich war.

Ich muss die Kartenzahlen in abhängigkeit der Rundenanzahl ausgeben also runde 1 = 1 Karte, 2 = 2 Karten etc.

das will ich dann irgendwie aufiterieren damit es dann mehr karten ausgibt.

0
xxxcyberxxx  10.12.2021, 01:11
@BlackDragon2210
das will ich dann irgendwie aufiterieren damit es dann mehr karten ausgibt.

aha, und warum willst du das nicht beim Aufrufer machen? So im SInne von (hier jetzt mal mit 10 Karten)

def draw_cards(deck, players, hand_cards):
  # code davor
  for _ in range(hand_cards):
    # code in der Schleife

def main():
  deck = ...
  players = ... 
  for i in range(1, 6):
    hands = draw_cards(deck, players, i)

i in der Schleife in Main ist die Anzahl der Handkarten. Im Schleifenkörper kannst du dann damit arbeiten, wenn du es eben brauchst

0

Schreib mal "global rounds" über rounds = 1