Lista 2D ma dziwne zachowanie podczas próby modyfikacji pojedynczej wartości [duplikat]

Możliwy duplikat:
Unexpected feature in a Python list of lists

Więc jestem stosunkowo nowy w Pythonie i mam problemy z pracą z listami 2D.

Oto Mój kod:

data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data

A oto wyjście (sformatowane pod kątem czytelności):

[['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None]]

Dlaczego każdemu wierszowi przypisywana jest wartość?

Author: zeet, 2010-04-29

3 answers

To tworzy listę z pięcioma odniesieniami do tej samej listy:

data = [[None]*5]*5

Użyj czegoś takiego zamiast tego, co tworzy pięć oddzielnych list:

>>> data = [[None]*5 for _ in range(5)]

Teraz robi to, czego oczekujesz:

>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None]]
 54
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 17:49:49

Jako odniesienie do biblioteki Pythona dla typów sekwencji , która zawiera listy, mówi

Zauważ również, że kopie są płytkie; zagnieżdżone struktury nie są kopiowane. To często nawiedza nowych programistów Pythona; rozważ:

>>> lists = [[]] * 3
>>> lists
  [[], [], []]
>>> lists[0].append(3)
>>> lists
  [[3], [3], [3]]

Stało się, że [[]] jest jednoelementową listą zawierającą pustą listę, więc wszystkie trzy elementy [[]] * 3 są (wskaźnikami do) tej pojedynczej pustej listy. Modyfikowanie któregokolwiek z elementów list modyfikuje tę pojedynczą listę.

Możesz utworzyć listę różnych list w ten sposób:

>>> lists = [[] for i in range(3)]  
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
  [[3], [5], [7]]
 10
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-26 22:32:45

W Pythonie każda zmienna jest obiektem, a więc referencją. Najpierw utworzyłeś tablicę 5 Nonów, a następnie zbudowałeś tablicę z 5 razy tym samym obiektem.

 2
Author: lfagundes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 17:51:32