Kopiowanie wybranego elementu z listy do listy i działanie mat. na nim. Nie całości.

0

Witam ponownie.

Mam dziwny problem dla mnie kompletnie niezrozumiały.
Chcę pobrać element z jednej listy (lista list) i dopisać go do innej. Próbuję z += czy append czy extend.
Wszystko rozbija się o fakt, że po "skopiowaniu/dodaniu/rozszerzeniu" oba elementy mają to samo id więc operacja na nowym w innej liście
wykonuje się również na tym oryginalnym w liście pierwszej.

#! /usr/bin/env python3

a=[[1,],[2,],[3,],]

b=[]
b.append(a[0])

print(a)
print(b)
print('id a[0]->',id(a[0]))
print('id b[0]->',id(b[0]))

b[0][0]+=5

print(a)
print(b)

Wynik:

[[1], [2], [3]]
[[1]]
id a[0]-> 139710752800648
id b[0]-> 139710752800648
[[6], [2], [3]]
[[6]]

Nadmienię, że to jest lista list. Sprawdziłem w python wer. 2 To samo.
Co robię źle. Jak to wykonać.

Pozdrawiam
Radosław Głębicki

2

Chcesz przypisać nie samo a[0], ale kopię a[0]. Zapewne nawet copy.deepcopy(a[0]).

0

musisz zrobić kopie listy bo tak to dodajesz jedynie referencje, która będzie oczywiście współdzielona między a i b. Zrób tak:

b.append(a[0][:])
0

Jak słusznie zasugerował @jvoytech powinieneś posłużyć się operacją slice na liście, co stworzy tak zwana płytka kopię. Wszystko jest wytłumaczone w dokumentacji:
https://docs.python.org/3/tutorial/introduction.html#lists
Nie musisz jednak robić kopii całej listy, jeżeli chcesz skopiować konkretny element. Możesz działać na przykład w ten sposób jeżeli chcesz działać bezpośrednio na tej zagnieżdżonej liście:
b.extend(a[0][:])
Złożony operator tutaj nie zadziała, ponieważ defaultowo działa on na oryginale.

1 użytkowników online, w tym zalogowanych: 0, gości: 1