what's wong with that syntax?

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
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

hi alle,


was ist hier falsch?


a = [[]]*10;
a[1].append(1);


In [9]: a
Out[9]: [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

ich will nicht alle fuellen, sondern nur in die 2. liste einfuegen...

viellen dank schonmal in vorraus!

----------------
Python 2.5.4 (r254:67916, Sep 24 2009, 13:11:33)
Type "copyright", "credits" or "license" for more information.

IPython 0.9.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Magst Du vielleicht Code-Tags benutzen?

Zur Frage:

Code: Alles auswählen

In [1]: a = [[]]*10
In [2]: a[0] is a[1]
Out[2]: True
In [3]: b = [[], []]
In [4]: b[0] is b[1]
Out[4]: False
Und warum machst du ';' hinter Zeilen?

HTH
Christian
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

Magst Du vielleicht Code-Tags benutzen?

Zur Frage:

Code: Alles auswählen

In [1]: a = [[]]*10
In [2]: a[0] is a[1]
Out[2]: True
In [3]: b = [[], []]
In [4]: b[0] is b[1]
Out[4]: False
Ich will die inneren listen unterschiedlich wachsen lassen.

So dass z.B.

Code: Alles auswählen

In [1]: len(a[1])
Out[2]: 10
In [3]: len(a[2])
Out[4]: 14
Und warum machst du ';' hinter Zeilen?
- Alte C,Java und vor allem Matlab Angewohnheit.

HTH
Christian
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

CM, etwas Erklärung wäre da schon ganz gut. thomas15, das Problem ist, dass a[x] für alle gültigen x in deinem Beispiel immer das gleiche Objekt ist:

Code: Alles auswählen

>>> a = [[]]*3
>>> a[0] is a[1] is a[2]
True
>>> a[0].append('foo')
>>> a[0]
['foo']
>>> a[1]
['foo']
Siehe auch "mutable/immutable objects".

Was du willst ist

Code: Alles auswählen

a = [[] for _ in xrange(10]
...aber das kommt mir eh ein wenig seltsam vor, sowas lässt man dynamisch wachsen und macht nicht gleich am Anfang N Listen. Und bevor du mit verschachtelten Listen anfängst rumzumurksen, bau dir lieber gleich Klassen ;-)
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

In Python ist jeder Name ein Pointer auf ein Objekt, wie Christian schon angedeutet hat. In deinem Fall hast du zehn Namen (a[0], a[1], ... a[9]) an das gleiche Objekt gebunden. Um das zu umgehen kannst du Listening Comprehension verwenden:

Code: Alles auswählen

[[] for i in xrange(10)]
Grüße
Gerrit

Edit: Zu langsam :cry:
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

CM, etwas Erklärung wäre da schon ganz gut. thomas15, das Problem ist, dass a[x] für alle gültigen x in deinem Beispiel immer das gleiche Objekt ist:
Ok, ich habe N klassen, wobei ich nicht weiss wievielle Objekte in einer Klasse i stecken. Ich will eigenschaften der Objekte vergleichen, deswegen will ich sie sammeln und dann numerisch verarbeiten
Und bevor du mit verschachtelten Listen anfängst rumzumurksen, bau dir lieber gleich Klassen ;-)
In dem Fall zu aufwendig, will schnelles Ergebniss und kein Deluxe Softwareengineering Produkt.

Trotzdem, viellen dank fuer

Code: Alles auswählen

[[] for _ in xrange(10)]
kannte ich noch nicht. Was heiss das _ in dem Fall?

Danke euch beiden fuer die Hilfe!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

gkuhl hat geschrieben:Um das zu umgehen kannst du Listening Comprehension verwenden
Das war was anderes :twisted:

Der `_` wird haeufig als Platzhalter fuer uninteressante Namen benutzt. Im interaktiven Interpreter steht er aber fuer den letzten Rueckgabewert.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

cofi hat geschrieben:
gkuhl hat geschrieben:Um das zu umgehen kannst du Listening Comprehension verwenden
Das war was anderes :twisted:
oh man :oops: :lol:
thomas15
User
Beiträge: 98
Registriert: Montag 7. April 2008, 19:07

ok, _ guter tip
das ander hat auch funktioniert, danke!
Antworten