Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: marosh1976 05. 01. 2022, 10:42:44

Název: Chování seznamu v Pythonu
Přispěvatel: 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...

Kód: [Vybrat]
a = [1]
b = [2]
c = [a, b]
a[0] = 2
print(c)
>[[2], [2]]
Název: Re:Chování seznamu v Pythonu
Přispěvatel: JsemJenMetar 05. 01. 2022, 11:15:29
To jsi asi dlouho nehledal viď. https://docs.python.org/3/library/copy.html (https://docs.python.org/3/library/copy.html)
Název: Re:Chování seznamu v Pythonu
Přispěvatel: Ink 05. 01. 2022, 11:40:20
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...

Kód: [Vybrat]
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.
Název: Re:Chování seznamu v Pythonu
Přispěvatel: uetoyo 05. 01. 2022, 11:44:23
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.
Název: Re:Chování seznamu v Pythonu
Přispěvatel: Filip Jirsák 05. 01. 2022, 11:57:16
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.
Název: Re:Chování seznamu v Pythonu
Přispěvatel: marosh1976 05. 01. 2022, 14:55:54
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
Název: Re:Chování seznamu v Pythonu
Přispěvatel: uetoyo 05. 01. 2022, 15:21:55
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)
Název: Re:Chování seznamu v Pythonu
Přispěvatel: Idris 05. 01. 2022, 17:38:36
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 :)
Název: Re:Chování seznamu v Pythonu
Přispěvatel: uetoyo 05. 01. 2022, 17:53:53
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 :)
Název: Re:Chování seznamu v Pythonu
Přispěvatel: Idris 05. 01. 2022, 18:09:17
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…
Název: Re:Chování seznamu v Pythonu
Přispěvatel: qelurg 18. 01. 2022, 20:52:26
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.