Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: marosh1976 05. 01. 2022, 10:42:44
-
Ahoj, může mi někdo vysvětlit toto chování Pythonu?
Proč se v c nevytvoří seznam s hodnotami [[1],[2]] ale instance a a b?
Pro jiné datové typy např. kdyby a,b byly int se to chová normálně.
nebo poslat odkaz na vysvětlení, nikde jsem nic nenašel...
a = [1]
b = [2]
c = [a, b]
a[0] = 2
print(c)
>[[2], [2]]
-
To jsi asi dlouho nehledal viď. https://docs.python.org/3/library/copy.html (https://docs.python.org/3/library/copy.html)
-
Ahoj, může mi někdo vysvětlit toto chování Pythonu?
Proč se v c nevytvoří seznam s hodnotami [[1],[2]] ale instance a a b?
Pro jiné datové typy např. kdyby a,b byly int se to chová normálně.
nebo poslat odkaz na vysvětlení, nikde jsem nic nenašel...
a = [1]
b = [2]
c = [a, b]
a[0] = 2
print(c)
>[[2], [2]]
Budeš muset zreevidovat, co je "normálně", jak se v Pythonu pracuje s mutable a immutable typy apod. Jinými slovy, zainvestovat do pořádného pochopení, každý jazyk se z různých důvodů chová po svém a ne tak, jak bys nutně předpokládal.
-
Proč se v c nevytvoří seznam s hodnotami [[1],[2]] ale instance a a b?
Protože takové je chování Pythonu, přesněji řečeno seznam spadá do mutable collection. Jde o referenci a jak odkazoval předřečník, vše je jasně vysvětlěné hned na začátku: "Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy is sometimes needed so one can change one copy without changing the other. "
Jsou jazyky, které to tak nemají, tak možná tvá poznámka o "normálnosti", tě k nim přirozeně navede.
-
Nastudujte si rozdíl mezi předáváním hodnotou a referencí. Hodnota je samotný údaj (třeba číslo), reference je jenom odkaz do paměti, kde je ta hodnota uložená. Kdyby se pole předávalo hodnotou, znamená to, že se musí celé pole zkopírovat – což by u velkého pole trvalo nějakou dobu a navíc byste potřeboval paměť pro dvě kopie pole. Když někam předáte referenci, zkopíruje se jenom a reference (odkaz do paměti, což je jen nějaké číslo). Pak ale máte dva (nebo více) odkazů na stejné místo paměti – a když v té paměti něco změníte, změní se ten údaj, ať se na tu paměť díváte přes kteroukoli referenci.
-
Děkuji Ink a uetoyo za relevantní odpovědi.
našel jsem stránku kde je to srozumitelně vysvětleno:
https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747
-
Děkuji Ink a uetoyo za relevantní odpovědi.
našel jsem stránku kde je to srozumitelně vysvětleno:
https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747
Není zač. V tomto videu Chris Lattner vysvětluje rozdíl mezi Pythonem a Swiftem.
Zmiňuje tam právě i tento problém. A ano, toto chování je často hodně problematické.
https://www.youtube.com/watch?v=UTFFR61xVbs&ab_channel=LexClips
(třetí minuta)
-
Děkuji Ink a uetoyo za relevantní odpovědi.
našel jsem stránku kde je to srozumitelně vysvětleno:
https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747
Není zač. V tomto videu Chris Lattner vysvětluje rozdíl mezi Pythonem a Swiftem.
Zmiňuje tam právě i tento problém. A ano, toto chování je často hodně problematické.
https://www.youtube.com/watch?v=UTFFR61xVbs&ab_channel=LexClips
(třetí minuta)
Swift je divnej :)
-
Děkuji Ink a uetoyo za relevantní odpovědi.
našel jsem stránku kde je to srozumitelně vysvětleno:
https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747
Není zač. V tomto videu Chris Lattner vysvětluje rozdíl mezi Pythonem a Swiftem.
Zmiňuje tam právě i tento problém. A ano, toto chování je často hodně problematické.
https://www.youtube.com/watch?v=UTFFR61xVbs&ab_channel=LexClips
(třetí minuta)
Swift je divnej :)
Škoda že zařízli ten projekt Swift/TensorFlow a celý ten ekosystém kolem https://github.com/apple/swift/blob/main/docs/DifferentiableProgramming.md. Já ho aktivně používat nemůžu, ale jazyk je to pěkný. Ale snad nás od Pythonu zachrání Julia :)
-
Děkuji Ink a uetoyo za relevantní odpovědi.
našel jsem stránku kde je to srozumitelně vysvětleno:
https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747
Není zač. V tomto videu Chris Lattner vysvětluje rozdíl mezi Pythonem a Swiftem.
Zmiňuje tam právě i tento problém. A ano, toto chování je často hodně problematické.
https://www.youtube.com/watch?v=UTFFR61xVbs&ab_channel=LexClips
(třetí minuta)
Swift je divnej :)
Škoda že zařízli ten projekt Swift/TensorFlow a celý ten ekosystém kolem https://github.com/apple/swift/blob/main/docs/DifferentiableProgramming.md. Já ho aktivně používat nemůžu, ale jazyk je to pěkný. Ale snad nás od Pythonu zachrání Julia :)
Julia a Rust…
-
Děkuji Ink a uetoyo za relevantní odpovědi.
našel jsem stránku kde je to srozumitelně vysvětleno:
https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747
Ve skutečnosti to není záležitost vlastnosti (im)mutable, ale toho, že Python je objektový jazyk a jeho proměnné nikdy neobsahují hodnotu, ale odkaz na datový objekt. Proměnné 'a' a 'b' nejsou hodnoty, ale odkazy na hodnoty a tyto odkazy na hodnoty se přenesou i do toho seznamu.