Seite 1 von 1

what's wong with that syntax?

Verfasst: Mittwoch 9. Dezember 2009, 14:37
von thomas15
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.

Verfasst: Mittwoch 9. Dezember 2009, 14:44
von CM
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

Verfasst: Mittwoch 9. Dezember 2009, 14:53
von thomas15
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

Verfasst: Mittwoch 9. Dezember 2009, 15:08
von Dauerbaustelle
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 ;-)

Verfasst: Mittwoch 9. Dezember 2009, 15:11
von gkuhl
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:

Verfasst: Mittwoch 9. Dezember 2009, 15:21
von thomas15
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!

Verfasst: Mittwoch 9. Dezember 2009, 15:31
von cofi
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.

Verfasst: Mittwoch 9. Dezember 2009, 15:45
von gkuhl
cofi hat geschrieben:
gkuhl hat geschrieben:Um das zu umgehen kannst du Listening Comprehension verwenden
Das war was anderes :twisted:
oh man :oops: :lol:

Verfasst: Mittwoch 9. Dezember 2009, 16:04
von thomas15
ok, _ guter tip
das ander hat auch funktioniert, danke!