Hledáš dárek, který neskončí v koši? Nyní 90 % extra kreditů ZDARMA s promo kódem PREKVAPENI90. Zjisti více:
NOVINKA: Staň se datovým analytikem od 0 Kč a získej jistotu práce, lepší plat a nové kariérní možnosti. Více informací:

Diskuze – Lekce 8 - Kopírování objektů v Pythonu

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Nejnovější komentáře jsou na konci poslední stránky.
Avatar
Milan Pavlíček:26. června 19:56

Docela složitě napsané.
Musel jsem si to několikrát přečíst, abych pochopil.
Každý má jinou představivost a pochopení.

Avatar
Jan Kupčík
Člen
Avatar
Odpovídá na Mirek Benešovský
Jan Kupčík:26. listopadu 12:04

Taky jsem si říkal, že to je spíš naopak, že reference jsou nezávisle a když změníme jednu ta druhá stále funguje viz příklad None u předchozí lekce.

Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jan Kupčík
DarkCoder:26. listopadu 13:16

Samozřejmě že ta formulace je chybně.

Máme-li 2 reference na tentýž objekt, pak změna jedné z nich (ukazuje jinám nebo na nic) neovlivní druhou referenci.

Pravděpodobně to bylo myšleno následovně.

Máme-li 2 reference na tentýž objekt, pak změna objektu pomocí jedné reference se projeví při přístupu k objektu pomocí druhé reference.

Příklad:

class Uzivatel:
    def __init__(self, jmeno, vek):
        self.jmeno = jmeno
        self.vek = vek

    def __str__(self):
        return f"{self.jmeno} ({self.vek})"


# --- vytvoření dvou objektů ---
u = Uzivatel("Jan Novák", 28)
v = Uzivatel("Josef Nový", 32)

print("Původní objekty:")
print(f"u: {u}, id(u)={id(u)}")
print(f"v: {v}, id(v)={id(v)}\n")

# --- přiřazení reference ---
u = v  # teď obě proměnné ukazují na tentýž objekt (Josef Nový, 32)
# Původní objekt "Jan Novák" už nemá žádnou referenci → může být uvolněn garbage collectorem
print("Po přiřazení 'u = v':")
print(f"u: {u}, id(u)={id(u)}")
print(f"v: {v}, id(v)={id(v)}\n")

# --- změna atributu objektu ---
v.jmeno = "John Doe"
print("Po změně atributu přes 'v':")
print(f"u: {u}, id(u)={id(u)}")  # u také vidí změnu
print(f"v: {v}, id(v)={id(v)}\n")

# --- změna reference ---
v = Uzivatel("Nový uživatel", 40)  # v nyní ukazuje na nový objekt
# Původní objekt (John Doe, 32) stále existuje, protože na něj ukazuje 'u'
print("Po změně reference 'v':")
print(f"u: {u}, id(u)={id(u)}")  # u stále ukazuje na původní objekt
print(f"v: {v}, id(v)={id(v)}")  # v ukazuje na nový objekt
Odpovědět
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jan Kupčík
Člen
Avatar
Odpovídá na DarkCoder
Jan Kupčík:26. listopadu 15:14

"Máme-li 2 reference na tentýž objekt, pak změna objektu pomocí jedné reference se projeví při přístupu k objektu pomocí druhé reference."

Trvrzením výše máš na mysli nasledující blok kódu?

# --- změna atributu objektu ---
v.jmeno = "John Doe"
print("Po změně atributu přes 'v':")
print(f"u: {u}, id(u)={id(u)}")  # u také vidí změnu
print(f"v: {v}, id(v)={id(v)}\n")
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jan Kupčík
DarkCoder:26. listopadu 15:19

Ano, přesně tak.

v.jmeno = "John Doe"

to je změna objektu pomocí v. A jelikož obě reference (u i v) ukazují na tentýž objekt, pak se změna promítne při přístupu k objektu pomocí u.

print(f"u: {u}, id(u)={id(u)}")  # u také vidí změnu
Editováno
Odpovědět
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Nejnovější komentáře jsou na konci poslední stránky.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 15.