Seite 1 von 1

object does not support item assignment

Verfasst: Mittwoch 14. September 2005, 20:25
von qweet
Hallo,

Hab bei dem Code hier:

Code: Alles auswählen

import randomclient

C = randomclient.truerand(10, 'b')

D = C

D[0][1] = 'x'
die Fehlermeldung:
object does not support item assignment

(Anm.: randomclient.truerand(10, 'b') liefert eine Liste mit Zufallszahlen. Das sind dann 10 BLöcke zu je 8 Zufallszahlen)

Gibt es eine Möglichkeit, trotzdem der Liste D, Werte zuzuweisen? Dass vielleicht irgendwo ein Attribut dieses Objektes geändert wird und dann funktioniert das?

mfg,
qweet

Verfasst: Mittwoch 14. September 2005, 22:14
von BlackJack
Entweder ist `D` keine Liste, oder das erste Element von `D` kann keine Zuweisung in dieser Form. Bist Du sicher das `D` eine "zweidimensionale" Liste ist? Funktioniert ``print D[0][1]`` ohne Fehler?

Re: object does not support item assignment

Verfasst: Mittwoch 14. September 2005, 22:29
von Masaru
qweet hat geschrieben: C = randomclient.truerand(10, 'b')

(Anm.: randomclient.truerand(10, 'b') liefert eine Liste mit Zufallszahlen. Das sind dann 10 BLöcke zu je 8 Zufallszahlen)
Öhm ... versteh ich nicht ganz.

Muss ich mir das etwa so vorstellen?

Code: Alles auswählen

Wenn es eine zweidimensionale Liste ist, wie BlackJack ja auch vermutet, dann müsste es in etwa so aussehen (habe hier beispielhaft Zufallszahlen von 0-9 verwendet).

c= [ [1, 7, 3, 5, 4, 0, 5, 1],
       [1, 2, 0, 7, 5, 5, 3, 1],
       [3, 2, 7, 2, 7, 1, 3, 5],
       [1, 4, 0, 6, 9, 6, 9, 7],
       [6, 9, 5, 9, 5, 0, 9, 6],
       [6, 5, 9, 6, 7, 8, 5, 4],
       [8, 7, 8, 6, 6, 2, 4, 1],
       [5, 9, 6, 0, 4, 8, 1, 6],
       [1, 2, 8, 9, 3, 2, 7, 8],
       [2, 4, 0, 3, 7, 5, 3, 7],
     ]
Hm ... in Verbindung damit, dass du dann eine solche Zahl auf 'x' setzen möchtest, sieht das ganze ein bisschen wie eine Spielfeld-Matrix mit Positionierungspointer aus *g*.

Falls des ganze so aussehen sollte, versuch mal folgendes, und poste das Ergebnis:

Code: Alles auswählen

from pprint import pprint

print "Liste C:"
pprint(C)
print "--------"
print "Liste D:"
pprint(D)
>>Masaru<<

Verfasst: Mittwoch 14. September 2005, 23:11
von rayo
Hi

Ich würde einfach mal auf einen Tuple tippen anstatt auf eine Liste. Die Tuple unterstützen keine zuweisungen :).

gruss Rayo

Verfasst: Donnerstag 15. September 2005, 15:27
von qweet
Hi, :)

Bei
C und D
handelt es sich definitiv um Listen. Keine Tuples! Jedenfalls ziehe ich das aus der Info des randomclient-modules.

Auch funktioniert print(D[0][1]) ohne Fehler. Ebenso pprint(C) und pprint(D).

pprint(C) gibt bei mir folgende Ausgabe:

Code: Alles auswählen

pprint(C)
['00011111',
 '01001110',
 '01000011',
 '00101110',
 '00101100',
 '10111101',
 '10100110',
 '01110010',
 '10010101',
 '10110111']
Hab das alles in der IDLE-Shell getestet.

mfg,
qweet

Verfasst: Donnerstag 15. September 2005, 16:19
von rayo
Hi

Du kannst die einzelnen Zeichen eines Strings nicht einfach so ändern. Ein String ist immutable (unveränderbar).

kannst ja die Strings in eine Zahl wandeln (sieht nach einer Zahl in Binärdarstellung aus)

print int('01101100',2)

Da kannst du die einzelnen Bits immernoch ändern.

Gruss

Verfasst: Donnerstag 15. September 2005, 20:43
von Masaru
Oder:
- du verwendest ein 2-dimensionales Array
oder
-du schreibst eine Methode, um deine 8'er Zeichenketten Blöcke zu modifzieren, wie z.B.:

Code: Alles auswählen

>>> def new_block(cur_block, index, value):
...    if not isinstance(value, str):
...        value = str(value)
...    if index >= len(cur_block):
...        raise IndexError, "Index out of range"
...    result =  cur_block[0:index] + value + cur_block[index+1:len(cur_block)]
...    return result

>>> C[1] = new_block(C[1], 4, 'x')
>>> pprint(C)
['10000000',
 '1011x010',
 '11110010',
 '11010000',
 '01000000',
 '00111011',
 '00001110',
 '10110011',
 '10010011',
 '10100101']
>>Masaru<<