Chování seznamu v Pythonu

Chování seznamu v Pythonu
« kdy: 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]]
« Poslední změna: 05. 01. 2022, 11:11:34 od Petr Krčmář »


Re:Chování seznamu v Pythonu
« Odpověď #1 kdy: 05. 01. 2022, 11:15:29 »
To jsi asi dlouho nehledal viď. https://docs.python.org/3/library/copy.html

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Chování seznamu v Pythonu
« Odpověď #2 kdy: 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.

Re:Chování seznamu v Pythonu
« Odpověď #3 kdy: 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.

Re:Chování seznamu v Pythonu
« Odpověď #4 kdy: 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.


Re:Chování seznamu v Pythonu
« Odpověď #5 kdy: 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

Re:Chování seznamu v Pythonu
« Odpověď #6 kdy: 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)
« Poslední změna: 05. 01. 2022, 15:23:38 od uetoyo »

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Chování seznamu v Pythonu
« Odpověď #7 kdy: 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 :)

Re:Chování seznamu v Pythonu
« Odpověď #8 kdy: 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 :)

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Chování seznamu v Pythonu
« Odpověď #9 kdy: 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…

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Chování seznamu v Pythonu
« Odpověď #10 kdy: 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.