Seite 1 von 1

Sind Zuweisungen keine Kopien sondern eine Art Pointer?

Verfasst: Montag 6. Mai 2019, 13:08
von Ollom
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

Re: Sind Zuweisungen keine Kopien sondern eine Art Pointer?

Verfasst: Montag 6. Mai 2019, 13:46
von __deets__
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.

Re: Sind Zuweisungen keine Kopien sondern eine Art Pointer?

Verfasst: Montag 6. Mai 2019, 14:06
von Ollom
Ach super. So klappt es.
Danke auch für die Tips. Werde ich mir mal angucken...

Re: Sind Zuweisungen keine Kopien sondern eine Art Pointer?

Verfasst: Montag 6. Mai 2019, 14:10
von __blackjack__
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)]