Problème liste python

Fermé
nejah - Modifié le 2 oct. 2021 à 10:01
 nejah - 7 oct. 2021 à 00:41
Bonjour,

J'ai saisi le code suivant en python dont son objectif le remplissage du contenu d'une matrice présenté par une liste de liste
def saisir():
    while True:
        l=int(input('Donner le nombre de lignes: '))
        if 2<=l<=10:
            break
    while True:
        c=int(input('Donner le nombre de colonnes: '))
        if 2<=c<=10:
            break
    return l,c
    
def remplir(l,c):
    m=[[0]*c]*l
    for i in range(l):
        for j in range(c):
            while True:
                m[i][j]=int(input('M['+str(i)+','+str(j)+']= '))
                if (0<=m[i][j]<=9):
                    break
    return m
def affichage(m,l,c):
    print('--- Contenu de la matrice ---')
    for i in range(l):
        for j in range(c):
            if j<c-1:
                print(m[i][j],end=' ')
            else:
                print(m[i][j])
    
l,c=saisir()
m=remplir(l,c)
affichage(m,l,c)


le programme s'exécute sans une erreur syntaxique mais le problème lors de l'affichage du contenu de cette matrice je découvre que chaque ligne de cette matrice est remplie par les valeurs de la dernière ligne, j'ai découvert l'erreur à travers une intervention d'un collègue et qui consiste de remplacer l'instruction de déclaration de la liste m=[[0]*c]*l par la déclaration d'une liste de compréhension suivante: m=[[0]*c for i in range(l)]
ma question qu'est ce qui s'est passé au niveau de la mémoire centrale et qui a provoquer cette erreur sémantique, car j'ai pas trouver une réponse logique
et merci
Configuration: Windows / Chrome 94.0.4606.61
A voir également:

1 réponse

jee pee Messages postés 40805 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 février 2025 9 525
Modifié le 2 oct. 2021 à 10:03
Bonjour,

La création d'un tableau avec * ne crée pas une nouvelle ligne physique, mais une référence vers la première ligne, on n'a donc qu'une seule ligne. Tout comme
tableau2 = tableau1
ne crée pas un nouveau tableau, mais tableau2 est une référence mémoire qui pointe vers tableau1, modifier l'un ou l'autre c'est pareil, il n'y a qu'une seule zone mémoire pour les 2 tableaux.

Voir : https://snakify.org/fr/lessons/two_dimensional_lists_arrays/#section_2

0
Merci jee pee pour la réponse, magnifique document que vous m'avez envoyer, j'ai une petite question que j'ai pas trouver la réponse, dans le cas ou je veux faire tableau2=tableau1 et en modifiant le contenu du tableau2 sans influencer sur le contenu du tableau1, que dois je faire? et merci
0
jee pee Messages postés 40805 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 février 2025 9 525 > nejah
6 oct. 2021 à 12:16
Pour faire une copie d'un tableau qui soit totalement indépendante de l'original, on va, par exemple, utiliser une fonction du module copy
from copy import deepcopy
tableau2=deepcopy(tableau1)

Pour gérer des tableaux en Python, on va souvent utiliser une bibliothèque spécialisée, comme NUMPY, qui comporte des fonctions pour les créer et les manipuler plus développées qu'en Python natif.
0
nejah > jee pee Messages postés 40805 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 février 2025
7 oct. 2021 à 00:41
Merci jee pee, moi en tant qu'enseignant et en respectant notre programme officiel qui nous exige d'utiliser les listes au lieu de la bibliothèque numpy pour représenter les tableau , c'est pour cette raison que je cherche une solution en ce sujet tout en utilisant les listes, dsl pour mon dérangement et encore je vous remercie infiniment
0