6 svar
81 visningar
destiny99 behöver inte mer hjälp
destiny99 Online 8065
Postad: 17 dec 08:42

hur många gånger skriver den ut 3 ?

v=[1,2]
m=[]
for i in range(2):
    m.append(v)
m[0][0]=3
for i in range(2):
    for j in range(2):
        print(m[i][j], end=" ")
    print()

 Hej!

jag är med på att vi lägger till en lista till en lista och ersätter det index elementet med 3. Men  jag testkörde denna och fick ut :

3 2 

3 2 

Hur ska man tänka kring de två looparna och hur de körs? 

Bedinsis 2998
Postad: 17 dec 09:13

Jag antar att du ville att m skulle bli [[3, 2], [1, 2]]. Ett enkelt sätt att göra detta på är att skriva så här istället:

v=[1,2]
m=[]
for i in range(2):
    m.append(v[:])
m[0][0]=3

För att förklara vad som händer så tror jag att då du sätter m.append(v) så säger du "lägg till listan m sist en referens till innehållet i variabeln v:s adress". Dvs. så som det är lagrat på hårddisken är v=[1,2]; m=[@v,@v]. Då du sedan ändrar vad som finns på första elementet i första elementet i m så ändrar du i själva verket vad som befinner sig i v:s första adress, så då du sedan tittar på samtliga element i m får du ut att innehållet i första elementets första element och andra elementets första element båda har ändrats.

Grejen med listor är att de skall kunna innehålla alla slags variabler och vara av oändlig längd, och för att kunna hantera detta på hårddisken så innehåller de i själva verket en lång lista med adresser på minnet där de faktiska variablerna befinner sig, så om man lägger till en lista till en lista så får vi adresser till adresser till faktiska värden och om man ändrar en av dem så fortplantar sig detta till andra adresser.

destiny99 Online 8065
Postad: 17 dec 09:22 Redigerad: 17 dec 09:23
Bedinsis skrev:

Jag antar att du ville att m skulle bli [[3, 2], [1, 2]]. Ett enkelt sätt att göra detta på är att skriva så här istället:

v=[1,2]
m=[]
for i in range(2):
    m.append(v[:])
m[0][0]=3

För att förklara vad som händer så tror jag att då du sätter m.append(v) så säger du "lägg till listan m sist en referens till innehållet i variabeln v:s adress". Dvs. så som det är lagrat på hårddisken är v=[1,2]; m=[@v,@v]. Då du sedan ändrar vad som finns på första elementet i första elementet i m så ändrar du i själva verket vad som befinner sig i v:s första adress, så då du sedan tittar på samtliga element i m får du ut att innehållet i första elementets första element och andra elementets första element båda har ändrats.

Grejen med listor är att de skall kunna innehålla alla slags variabler och vara av oändlig längd, och för att kunna hantera detta på hårddisken så innehåller de i själva verket en lång lista med adresser på minnet där de faktiska variablerna befinner sig, så om man lägger till en lista till en lista så får vi adresser till adresser till faktiska värden och om man ändrar en av dem så fortplantar sig detta till andra adresser.

Men den skriver inte ut som du säger. Terminalen visade nedan körning. Jag vet att detta är nestlade loop men vet ej i vilken ordning den börjar bara. Jag misstänker att vi börjat på i=0 och j=0 och då skriver den ut 3 och sen i=1 j=0 och då blir det m[1][0] och den skriver ut 2 osv dvs den gör sig klar med första loopen sen går den till andra loopen?

3 2

3 2

Bedinsis 2998
Postad: 17 dec 09:33 Redigerad: 17 dec 09:34

Då jag körde din kod med raden

	m.append(v)

fick jag utskriften

3

2

()

3

2

()

Då jag körde min kod med raden

	m.append(v[:])

fick jag utskriften

3

2

()

1

2

()

(jag fick inte end=" " att funka så jag tog bort det)

Menar du att den nästlade loopen är problemet? Om du blir osäker på vilket element den bör jobba med, lägg in några print(str(i)+" "+str(j)) på lämpliga platser och se om du håller med om vad resultatet blir.

destiny99 Online 8065
Postad: 17 dec 09:41
Bedinsis skrev:

Då jag körde din kod med raden

	m.append(v)

fick jag utskriften

3

2

()

3

2

()

Då jag körde min kod med raden

	m.append(v[:])

fick jag utskriften

3

2

()

1

2

()

(jag fick inte end=" " att funka så jag tog bort det)

Menar du att den nästlade loopen är problemet? Om du blir osäker på vilket element den bör jobba med, lägg in några print(str(i)+" "+str(j)) på lämpliga platser och se om du håller med om vad resultatet blir.

Ja asså den skriver ut allt detta. Men man vill ju se framför sig processen dit 

thedifference 409
Postad: 17 dec 17:04 Redigerad: 17 dec 17:18

Processen blir:

v=[1,2]
m=[]
for i in range(2):
    m.append(v)

# m = [[1, 2], [1, 2]]

m[0][0]=3 # byt ut första värdet i första värdet mot 3

# m = [[3, 2], [3, 2]]
# man skulle förvänta sig att andra listan skulle vara oförändrad
# se förklaring av Bedinsis till varför det inte är så

for i in range(2):
    for j in range(2):
        print(m[i][j], end=" ")
        # körs 4 gånger total genom hela koden (2*2)
        # först tar den m[0][0], vilket är första elementet i första listan, 3
        # sen tar den m[0][1], vilket är andra elementet i första listan, 2
        # första loopen är över och den printar tom rad
        # tredje gången den körs (nu är i=1) tar den m[1][0], vilket är första i andra listan, 3
        # fjärde gången tar den m[1][1], vilket är andra i andra listan, 2
    print()

Som flowchart, fast med mer traditionell for loop som i praktiken gör samma sak:

destiny99 Online 8065
Postad: 18 dec 11:51 Redigerad: 18 dec 11:51
thedifference skrev:

Processen blir:

v=[1,2]
m=[]
for i in range(2):
    m.append(v)

# m = [[1, 2], [1, 2]]

m[0][0]=3 # byt ut första värdet i första värdet mot 3

# m = [[3, 2], [3, 2]]
# man skulle förvänta sig att andra listan skulle vara oförändrad
# se förklaring av Bedinsis till varför det inte är så

for i in range(2):
    for j in range(2):
        print(m[i][j], end=" ")
        # körs 4 gånger total genom hela koden (2*2)
        # först tar den m[0][0], vilket är första elementet i första listan, 3
        # sen tar den m[0][1], vilket är andra elementet i första listan, 2
        # första loopen är över och den printar tom rad
        # tredje gången den körs (nu är i=1) tar den m[1][0], vilket är första i andra listan, 3
        # fjärde gången tar den m[1][1], vilket är andra i andra listan, 2
    print()

Som flowchart, fast med mer traditionell for loop som i praktiken gör samma sak:

Aa jag frågade AI och försökte förstå såhär innan provet. Det gick bra , Men ska absolut komma ihåg detta om jag kuggar provet. 

Svara
Close