Verständnisfrage Variablen

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
8023
User
Beiträge: 10
Registriert: Sonntag 21. Juli 2019, 15:21

irgendwei bin ich irretiert...

Code: Alles auswählen

#!/usr/bin/python3
#-*- coding: utf-8 -*-

import time

def GO1(data_g1):
    data_g1[0]            =   data_g1[0] + 1
    return None

def GO2(data_g2):
    data_g2[1]            =   data_g2[1] + 1
    return None

print('\033[=3h\033[2J')
DATA        =   [0,0]

while True:
    GO1(DATA)
    print("GO1 ", DATA)

    GO2(DATA)
    print("GO2 ", DATA)
               
    time.sleep(1)
ergebnis:

Code: Alles auswählen

GO1  [1, 0]
GO2  [1, 1]
GO1  [2, 1]
GO2  [2, 2]
GO1  [3, 2]
GO2  [3, 3]
GO1  [4, 3]
GO2  [4, 4]
ich hätte erwartet das DATA sich nicht ändert. wieso verändert sich DATA obwohl ich das array DATA gar nicht anfasse?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil du nur denkst du fasst es nicht an. Du übergibst die Liste doch als Argument. Und modifizierst die. Was sonst soll passieren?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Du übergibst die Liste (kein Array) an eine Funktion und machst dort etwas mit ihr.

Code: Alles auswählen

>>> def test_id(anything):
	print(f"ID: {id(anything)}")

	
>>> date = [1, 2, 3]
>>> id(data)
42319232
>>> test_id(data)
ID: 42319232
8023
User
Beiträge: 10
Registriert: Sonntag 21. Juli 2019, 15:21

__deets__ hat geschrieben: Donnerstag 11. Juni 2020, 15:01 Weil du nur denkst du fasst es nicht an. Du übergibst die Liste doch als Argument. Und modifizierst die. Was sonst soll passieren?
ich bin davon ausgegangen, dass nur der inhalt nach data_g übergeben wird und die Funktion verändert nur data_g
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist halt so nicht. Es gibt keine impliziten Kopien in Python. Es gibt unmodifizierbare Strukturen (tupel, frozensets, primitive Typen), aber Listen und Woerterbuecher kannst du veraendern, und das spiegelt sich dann wieder.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@8023: Python kopiert nie von sich aus Werte, das muss man immer explizit machen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
8023
User
Beiträge: 10
Registriert: Sonntag 21. Juli 2019, 15:21

hmmm,... na wieder was gelernt

Danke.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei vielleicht als Einschränkung zu meiner Aussage: Bei einfachen Zuweisungen an Namen mit ``=`` und beim übergeben von Argumenten, was ja im Grunde eine einfache Zuweisung an einen Namen ist.

Bei Zuweisung an Attribute oder per […]-Zugriff kann natürlich alles mögliche passieren, das hat Python ja nicht unter Kontrolle, sondern wer auch immer den Datentyp implementiert hat, dessen Attribut oder Index/Schlüssel man etwas zuweist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten