Jestem nowy w Pythonie, więc to pytanie może być trochę podstawowe. Mam zwaną krotkę, values
która zawiera następujące elementy:
('275', '54000', '0.0', '5000.0', '0.0')
Chcę zmienić pierwszą wartość (tj. 275
) W tej krotce, ale rozumiem, że krotki są niezmienne, więc values[0] = 200
nie będą działać. Jak mogę to osiągnąć?
Odpowiedzi:
Najpierw musisz zapytać, dlaczego chcesz to zrobić?
Ale jest to możliwe poprzez:
Ale jeśli będziesz musiał coś zmienić, prawdopodobnie lepiej zachowaj to jako plik
list
źródło
W zależności od problemu krojenie może być naprawdę zgrabnym rozwiązaniem:
Pozwala to na dodanie wielu elementów lub też zastąpienie kilku elementów (szczególnie jeśli są one „sąsiadami”. W powyższym przypadku rzutowanie na listę jest prawdopodobnie bardziej odpowiednie i czytelne (mimo że notacja wycinania jest znacznie krótsza).
źródło
Cóż, jak już pokazała Trufa, istnieją zasadniczo dwa sposoby zastąpienia elementu krotki w danym indeksie. Przekonwertuj krotkę na listę, zamień element i przekonwertuj z powrotem lub utwórz nową krotkę przez konkatenację.
Więc która metoda jest lepsza, to znaczy szybsza?
Okazuje się, że w przypadku krótkich krotek (w Pythonie 3.3) konkatenacja jest faktycznie szybsza!
Jeśli jednak przyjrzymy się dłuższym krotkom, najlepszą drogą jest konwersja listy:
W przypadku bardzo długich krotek konwersja listy jest znacznie lepsza!
Również wydajność metody konkatenacji zależy od indeksu, w którym zastępujemy element. W przypadku metody listowej indeks nie ma znaczenia.
Więc: jeśli twoja krotka jest krótka, pokrój i połącz. Jeśli jest długi, wykonaj konwersję listy!
źródło
Jest to możliwe z jednym wkładem:
źródło
values
?i = 2; values = (*values[:i], '300', *values[i+1:])
Nie żeby to było lepsze, ale jeśli ktoś jest ciekawy, można to zrobić w jednej linii za pomocą:
źródło
tuple = tuple(200 if i == 0 else _ for i, _ in enumerate(tuple))
? (Dlaczego nie rozumienie przez generator?)Wydaje mi się, że to technicznie odpowiada na pytanie, ale nie rób tego w domu. W tej chwili wszystkie odpowiedzi obejmują utworzenie nowej krotki, ale możesz użyć jej
ctypes
do zmodyfikowania krotki w pamięci. Opierając się na różnych szczegółach implementacji języka CPython w systemie 64-bitowym, można to zrobić w następujący sposób:źródło
Jak napisał Hunter McMillen w komentarzach, krotki są niezmienne, aby to osiągnąć, musisz utworzyć nową krotkę. Na przykład:
źródło
EDYCJA: To jeszcze nie działa na krotkach ze zduplikowanymi wpisami !!
Na podstawie pomysłu Pooyi :
Jeśli planujesz robić to często (czego nie powinieneś, ponieważ krotki są niezmienne z jakiegoś powodu), powinieneś zrobić coś takiego:
Lub w oparciu o pomysł Jona :
źródło
Po pierwsze, zadaj sobie pytanie, dlaczego chcesz zmutować swój plik
tuple
. Istnieje powód, dla którego ciągi znaków i krotka są niezmienne w Ptyhonie , jeśli chcesz zmutować swójtuple
, prawdopodobnie powinien to byćlist
a.Po drugie, jeśli nadal chcesz zmutować swoją krotkę, możesz przekonwertować
tuple
ją nalist
a, a następnie przekonwertować ją z powrotem i ponownie przypisać nową krotkę do tej samej zmiennej. Jest to świetne rozwiązanie, jeśli zamierzasz zmutować swoją krotkę tylko raz . W przeciwnym razie osobiście uważam, że jest to sprzeczne z intuicją. Ponieważ zasadniczo tworzy nową krotkę i za każdym razem, jeśli chcesz zmutować krotkę, musisz wykonać konwersję. Jeśli przeczytasz kod, zastanowienie się, dlaczego nie po prostu utworzyć plikulist
? Ale jest fajny, ponieważ nie wymaga żadnej biblioteki.Sugeruję użycie
mutabletuple(typename, field_names, default=MtNoDefault)
z mutabletuple 0.2 . Osobiście uważam, że ten sposób jest bardziej intuicyjny i czytelny. Osobiste odczytanie kodu wiedziałoby, że autor zamierza w przyszłości zmodyfikować tę krotkę. Wadą w porównaniu zlist
powyższą metodą konwersji jest to, że wymaga to zaimportowania dodatkowego pliku py.TL; DR : Nie próbuj mutować
tuple
. jeśli to zrobisz i jest to jednorazowa operacja, przekonwertuj jątuple
na listę, zmień ją, zamieńlist
na nowątuple
i ponownie przypisz z powrotem do zmiennej przechowującej staretuple
. Jeślituple
pragniesz i chcesz w jakiś sposób uniknąćlist
i chcesz mutować więcej niż raz, stwórzmutabletuple
.źródło
oparty na Pomyśle Jona i drogiej Trufie
zmienia wszystkie stare wystąpienia wartości
źródło
Nie możesz. Jeśli chcesz to zmienić, musisz użyć listy zamiast krotki.
Zauważ, że możesz zamiast tego utworzyć nową krotkę, która będzie miała nową wartość jako pierwszy element.
źródło
Odkryłem, że najlepszym sposobem edycji krotek jest odtworzenie krotki przy użyciu poprzedniej wersji jako podstawy.
Oto przykład, którego użyłem do stworzenia jaśniejszej wersji koloru (miałem go już wtedy otwartą):
To, co robi, polega na tym, że przechodzi przez krotkę „kolor” i czyta każdy element, robi z nim coś, a na koniec dodaje go do nowej krotki.
Więc chciałbyś coś takiego:
Ten konkretny nie działa, ale koncepcja jest tym, czego potrzebujesz.
taka jest koncepcja.
źródło
Spóźniłem się na grę, ale myślę, że najprostszym , najbardziej przyjaznym dla zasobów i najszybszym sposobem (w zależności od sytuacji) jest nadpisanie samej krotki. Ponieważ wyeliminowałoby to potrzebę tworzenia listy i zmiennych i jest archiwizowane w jednej linii.
Ale: Jest to przydatne tylko w przypadku raczej małych krotek, a także ogranicza cię do ustalonej wartości krotki, niemniej jednak tak jest w przypadku krotek przez większość czasu.
Czyli w tym konkretnym przypadku wyglądałoby to tak:
źródło
tldr; „obejściem” jest utworzenie nowego obiektu krotki, a nie faktyczna modyfikacja oryginału
Chociaż jest to bardzo stare pytanie, ktoś powiedział mi o tym szaleństwie mutacji krotek w Pythonie. Co byłem bardzo zaskoczony / zaintrygowany, i robiąc trochę googlowania, wylądowałem tutaj (i inne podobne próbki online)
Przeprowadziłem test, aby udowodnić swoją teorię
Uwaga
==
czy równość wartości, podczas gdy równośćis
referencyjna (czy jest to ta sama instancja co obj b)Plony:
źródło
Nie możesz modyfikować elementów w krotce, ale możesz modyfikować właściwości zmiennych obiektów w krotkach (na przykład jeśli te obiekty są listami lub rzeczywistymi obiektami klas)
Na przykład
źródło
ja to zrobiłem:
a żeby zmienić, po prostu zrób
i możesz zmienić krotkę: D
tutaj jest to dokładnie skopiowane z IDLE
źródło
x = (y)
nie robi nic poza przypisaniem y do x.Możesz zmienić wartość krotki za pomocą kopiowania przez odniesienie
źródło