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ść?
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]]
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]]
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.
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