Kezdőoldal » Számítástechnika » Programozás » Az alábbi Python kód miért...

Az alábbi Python kód miért így viselkedik?

Figyelt kérdés

[link]

Az l[0][1]=True értékadás hatására [[False, True, False], [False, False, False], [False, False, False]] ez lenne logikus.


2013. jan. 26. 15:26
1 2
 1/13 A kérdező kommentje:

Közvetlenül nem a kérdéshez kapcsolódik, de mivel logikátlannak tartom azért írtam ki a kérdést, azonnal egy másik logikátlan dologgal találkoztam:

"

A kérdésed már kiírásra került, a kulcsszó mező kitöltése nem kötelező - ha ki akarod hagyni ezt a lépést, egyszerűen nem kell továbblépned.


A következő mezőket még kötelező megadnod: Add meg itt a kulcsszavakat. "

[link]

2013. jan. 26. 15:34
 2/13 iostream ***** válasza:
100%

Ez nem logikátlanság, ez annyi, hogy a Pythonban MINDEN objektum, és mindent referenciaként vesz át. A True és a False is objektum, a lista is objektum, és mikor ezt írod:


for i in range(0,3): result.append(falselist)


Ugyanazt a listát adod hozzá a resulthoz háromszor. Nem ugyanolyan értékűt, hanem pontosan ugyanazt, ugyanannak a listának a referenciáját.


Tehát ha az egyik referencián keresztül megváltoztatod a listát, akkor a többi referencián keresztül is ugyanazt fogod tudni kiolvasni.


Írd így:


for i in range(0,3): result.append(falselist[:])


A falselist[:] készít egy splice-t, egy részlista másolatot, ami itt véletlenül az egész lista lesz.

Általánosabb esetre itt van ez: [link]

2013. jan. 26. 15:47
Hasznos számodra ez a válasz?
 3/13 A kérdező kommentje:

Köszönöm.

Függvény paraméter esetén úgy tapasztaltam hogy nem referenciaként történik.

2013. jan. 26. 16:29
 4/13 iostream ***** válasza:
Pedig de, MINDEN referencia. Ha átadsz egy listát és módosítod, azt kint is látszani fog, nem másolja le a listát.
2013. jan. 26. 19:37
Hasznos számodra ez a válasz?
 5/13 A kérdező kommentje:

Ez nem igaz.

[link]

Még azt is elfogadja hogy f(10), a 10-et mint konstanst a szerint, amit mondasz azt is felülírná.

2013. jan. 26. 22:25
 6/13 iostream ***** válasza:
Ne azt mondd, hogy nem igaz, hanem hogy nem érted. Úgy kevésbé lenne arrogáns vagy nagyképű. Hidd el nekem, hogy minden referencia, és tanulj alázatot. Esetleg ha megkérsz, el is magyarázom.
2013. jan. 27. 12:25
Hasznos számodra ez a válasz?
 7/13 A kérdező kommentje:

Az első linkelt kódomhoz nincs más kérdésem, de ha azzal kapcsolatba van valami még amit tudni érdemes még szívesen fogadom.

A másik link: Bocsánat hogy azt feltételeztem hogy nem igaz, ha igaz végképp nem értem.

Az f függvény-el módosítom, a paraméterbe kapott listát, a függvény meghívása után a print mégsem a módosított értéket írta ki. Ez miért van? Miben különbözik attól mintha a lista másolata íródott volna felül és ezért maradt meg a globális változó értéke?

2013. jan. 27. 13:41
 8/13 iostream ***** válasza:
Ha azt írtad volna, hogy l.append(5), vagy l[0] = 10, akkor a listát módosítod. A te függvényed paraméterül kapott egy referenciát, érték szerint lemásolva lokális változóként (ez lett az l), majd értékadással ezt a lokális referenciát írta felül. Tehát l ezen túl nem arra a listára mutat, amire eddig.
2013. jan. 27. 16:04
Hasznos számodra ez a válasz?
 9/13 A kérdező kommentje:

Köszönöm.

>>> def f(a):

... a += 1

Ez esetben is referencia felülírás történik?( "a" egy int).

2013. jan. 27. 19:07
 10/13 iostream ***** válasza:

Igen, de miért nem próbálod ki? Akár interaktívan is.

A x += y Pythonban csak az x = x + y rövidítése, és mint említettem, az értékadás az ilyen dolog, a referenciára vonatkozik.

2013. jan. 27. 21:15
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!