Sind Zuweisungen keine Kopien sondern eine Art Pointer?

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
Ollom
User
Beiträge: 10
Registriert: Montag 6. Mai 2019, 12:50

Hallo,

ich versuche mich gerade in der Python Welt zurecht zu finden.
Ich möchte in einer Schleife zu einem immer gleichen Vektor, in diesem Falle FixData etwas hinzufügen. Leider funktioniert die Zuweisungen Line = FixData nicht.
Wenn ich mir am Ende FixData ausgeben lasse wird dies immer länger und ist nicht konstant. Wie genau muss ich die Zuweisung umformulieren, damit FixData in der Schleife nicht verändert wird, sondern nur Line?

Code: Alles auswählen

Data = []
FixData = []
FixData.append('1')
FixData.append('2')
FixData.append('3')

for Idx in range(0, 10):
        Line = []
        print('Line\n')
        print(Line)
        Line = FixData
        Line.append(Idx+2)
        Line.append(Idx+3)
        Line.append(Idx+4)
        Data.append(Line)
        print('Schleife am Ende\nFix Data:')
        print(FixData)
        print('Data am Ende\n')
Result:

Code: Alles auswählen

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 10]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 10, 9, 10, 11]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 10, 9, 10, 11, 10, 11, 12]
Data am Ende

Line

[]
Schleife am Ende
Fix Data
['1', '2', '3', 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 10, 9, 10, 11, 10, 11, 12, 11, 12, 13]
Data am Ende
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zuerstmal zur eigentlichen Frage: ja. Zuweisungen binden nur das gleiche Objekt an einen Namen, und haben sonst keine implizite Wirkung.

Dein konkretes Problem koennte man so loesen:

Code: Alles auswählen

data = []
fix_data = ['1', '2', '3'] # bist du sicher, dass das Strings sein sollen?
for index in range(10):
       line = fix_data + list(range(index + 2, index + 5))
       data.append(line)
Ein paar Anmerkungen:

- Bezeichner werden in Python klein und mit _ geschrieben. CamelCase ist fuer Klassen, GROSS fuer Konstanten.
- Nutze die Collection-Objekt-Literale, statt wie in anderen Sprachen (zB Java) muehselig append oder aehnliches aufzurufen.
- Schau dir mal genau an, was die Argumente zu range sind.
Ollom
User
Beiträge: 10
Registriert: Montag 6. Mai 2019, 12:50

Ach super. So klappt es.
Danke auch für die Tips. Werde ich mir mal angucken...
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Oder auch etwas kompakter als „list comprehension“:

Code: Alles auswählen

fix_data = ['1', '2', '3'] # bist du sicher, dass das Strings sein sollen?
data = [fix_data + list(range(index + 2, index + 5)) for index in range(10)]
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten