[python] diskuze

Matej Pivoluska pivoluska na matfyz.cz
Pondělí Červen 21 11:54:57 CEST 2004


Dňa Štvrtok 03 Jún 2004 07:24 Jakub Coufal napísal(a):
> Pratele.
> Vcera jsem psal SAXParser v Pythonu, vesele si pobrukoval
> ale pak mi spadla celist. Narazil jsem na neco co mi vyrazilo
> dech.
>
> Zjednoduseny priklad:
> ---------------------------------------------------------------------------
>------------------- jakub na gelion:~$ python2.1
> Python 2.1.3 (#1, Apr 20 2002, 10:14:34)
> [GCC 2.95.4 20011002 (Debian prerelease)] on linux2
> Type "copyright", "credits" or "license" for more information.
>
> >>> class maso:
>
> ...     nazev = ""
> ...     seznam = []
> ...
>
> >>> a = maso()
> >>> b = maso()
> >>>
> >>> a.nazev = "kotleta"
> >>> a.seznam.append("varena")
> >>>
> >>> b.nazev = "koleno"
> >>> b.seznam.append("uzene")
> >>>
> >>> print a.nazev
>
> kotleta
>
> >>> print a.seznam
>
> ['varena', 'uzene']
>
> >>> print b.nazev
>
> koleno
>
> >>> print b.seznam
>
> ['varena', 'uzene']
> ---------------------------------------------------------------------------
>------------------------ U objektu a i b seznam zaujima stejnou adresu v
> pameti. Nazev ne.
> Koukam na to jako tele a nevim jak to obejit. Jsou moznosti:
> 
> a) Jsem opravdu tele a neumim pouzivat objekty v Pythonu
> b) Je to spravne chovani, ktere mi ale naprosto nevyhovuje
> c) Je to chyba Pythonu jako hrom

d) je spravne, je to featura. 

takto ste vytvorili akoby data (string aj list) patriace triede, nie objektu. 
(Aj ked, v Pythone je to trochu komplikovanejsie a kazdy objekt ma (asi) 
vlastny __dict__, ktory si drzi pointery na tieto objekty.)

Rozdiel medzi string a list je v tom, ze string je nemodifikovatelny -- pri 
jeho zmene sa vyrobi novy a povodny zahodi. Na druhej strane, objekt typu 
list je modifikovatelny. Pri jeho zmeme sa novy nevytvara, akcia (pridanie 
odobranie) sa prevedie na povodnom objekte. 

Este to skombinujte s tym, ze kazdy objekt ma vlastny slovnik na jeho clenov, 
a mate vysvetlenie pre Vami opisovane chovanie. 

Pravdepodobne chcete toto:

class maso:
  def __init__(self):
    """Konstruktor, inicializuje clenske data pre kazdy jednotlivy objekt"""
    self.seznam = []
    self.nazev = ""

mP
-- 
http://pivoluska.matfyz.cz/weblog



Další informace o konferenci Python