[Tutor PyCZ] Vyrez z posloupnosti (slice) -- bylo RE: Regularni vyrazy

Petr Prikryl PrikrylP na skil.cz
Čtvrtek Září 22 09:31:34 CEST 2005


 
 

--
Petr Prikryl (prikrylp na skil.cz) 

 


________________________________

Obrat se zjišťováním délky je zbytečný -- viz dále.

geon napsal...
> [...]
> logText="s timto se setkavam poprve [...] rad"
> print logText[0:-1]
> 
> # toto prekvapilo i mne!! myslel jsem ze -1 znaci konec a ze
> # se vytiskne vse, ale chybi posledni znak ('d')! ale je to
> # spravne, kdyz je treba [1:4] tak to je 1,2,3 (4 uz ne) to
> # jen tak mimochodem, ze -1 se nedá pouzit. Musi se to pres
> # delku.
> 
> delka=len(logText)
> 
> [...]
> 
> vsouvaneSlovo=" chyby"
> logText = logText[0:pozice] + vsouvaneSlovo + logText[pozice:delka]
> print logText
> 
> Teorii k tomu dodá snad někdo jiný, nebo odkazuji na oficial
> tutoriál...

Index -1 skutečně znamená index posledního prvku v
posloupnosti (zde posledního znaku v řetězci).  Ale při
získávání výřezu z řetězce (slice) se berou znaky od prvního
zadaného indexu včetně až po druhý zadaný index VYJMA. Druhý
index vždy udává pozici, kterou už nebereme (prvek za
posledním zpracovávaným.

Místo zjišťování délky můžeme použít obrat logText[pozice:],
tj. vynecháme druhý index. Interpretuje se to jako "od
pozice až do konce". Podobně, když vynecháme první index,
interpretuje se to jako "od začátku". 

Vždy platí  s == s[:pozice] + s[pozice:]

Z uvedeného také vyplývá, že logText[:] vrací řetězec beze
změny (od začátku do konce). Ale dochází při tom ke vzniku
nového objektu řetězce, tedy ke KOPÍROVÁNÍ. U řetězců je to
spíš zbytečný obrat, protože okopírováním nic nezískáme.
Jsou totiž neměnné (immutable) a dokud existují, budou mít
pořád stejný obsah. 

Konkrétně u řetězců Python může novější verze Pythonu
provést vnitřní optimalizaci, takže se kopie nevytvoří: 
>>> s = 'abcd'
>>> s
'abcd'
>>> id(s)
9575168
>>> ss = s[:]
>>> ss
'abcd'
>>> id(ss)
9575168

(Identifikace objektů s i ss je stejná, to znamená že obě
jména odkazují na stejný objekt řetězce a ke kopii tedy
nedošlo.)

Jiné je to ale u seznamů, jejichž obsah můžeme měnit
(mutable). Uvedeným obratem se tedy často získává kopie
seznamu:

>>> L = ['abcd', 'efgh']
>>> L
['abcd', 'efgh']
>>> id(L)
9592384
>>> LL = L[:]
>>> LL
['abcd', 'efgh']
>>> id(LL)
9592424

Tady už se identifikace liší, takže k fyzické kopii došlo.
Obě jména ukazují na různé objekty.

pepr


Další informace o konferenci Tutor