2013-05-23 9 views
5

Kod:Przechowuj odwołanie do typu pierwotnego w języku Python?

>>> a = 1 
>>> b = 2 
>>> l = [a, b] 
>>> l[1] = 4 
>>> l 
[1, 4] 
>>> l[1] 
4 
>>> b 
2 

Co chcę zamiast widzieć się zdarzyć, że kiedy ustawić l [1] równą 4, że zmienna b zmienia się na 4.

Zgaduję, że gdy zajmujące się prymitywami, są kopiowane przez wartość, a nie przez odniesienie. Często widzę ludzi mających problemy z obiektami i potrzebujących zrozumieć głębokie kopie i takie. Zasadniczo chcę czegoś przeciwnego. Chcę móc zapisać referencję do prymitywu na liście, a następnie móc przypisać nowe wartości do tej zmiennej, używając jej rzeczywistej nazwy zmiennej b lub jej odwołania na liście l[1].

Czy to możliwe?

+0

Musisz 'L' z odniesieniem na "b", a nie na odwrót. –

+0

to pytanie jest bardzo abstrakcyjne. Czy próbujesz dowiedzieć się więcej o tym, jak działa Python (w porównaniu do innych języków, które możesz znać) lub czy próbujesz użyć tego jako rozwiązania jakiegoś problemu? jaki problem próbujesz rozwiązać? – SingleNegationElimination

Odpowiedz

3

Naprawdę nie można tego zrobić w Pythonie, ale można zbliżyć się poprzez zmienne a i b odnoszą się do obiektów kontenerowych modyfikowalnych zamiast liczb niezmiennych:

>>> a = [1] 
>>> b = [2] 
>>> lst = [a, b] 
>>> lst 
[[1], [2]] 
>>> lst[1][0] = 4 # changes contents of second mutable container in lst 
>>> lst 
[[1], [4]] 
>>> a 
[1] 
>>> b 
[4] 
+0

Ta odpowiedź i ta powyżej to w zasadzie mówią to samo na różne sposoby ... dzięki za oczyszczenie niezmiennego vs prymitywnego zamieszania dla mnie! – fdmillion

6

W Pythonie nie ma "prymitywów". Wszystko jest przedmiotem, nawet liczbami. Liczby w Pythonie są obiektami niezmiennymi. Tak więc, aby mieć odniesienie do liczby takiej, że "zmiany" do "liczby" są "widziane" przez wiele odniesień, odniesienie musi być przez np. lista pojedynczych elementów lub obiekt z jedną właściwością.

(To działa, ponieważ listy i przedmioty są zmienne i zmiana co liczba ich posiadaniu jest postrzegane przez wszystkich odniesień do niego)

przykład

>>> a = [1] 
>>> b = a 
>>> a 
[1] 
>>> b 
[1] 
>>> a[0] = 2 
>>> a 
[2] 
>>> b 
[2] 
0

Nie sądzę, jest to możliwe:

>>> lst = [1, 2] 
>>> a = lst[1] # value is copied, not the reference 
>>> a 
2 
>>> lst[1] = 3 
>>> lst 
[1, 3] # list is changed 
>>> a # value is not changed 
2 

a odnosi się do pierwotnej wartości lst[1], ale nie odnoszą się bezpośrednio do niego.

0

Pomyśl o l[0] jako o nazwie odnoszącej się do obiektu a i a jako nazwy odnoszącej się do liczby całkowitej.

Liczby całkowite są niezmienne, nazwy mogą się odnosić do różnych liczb całkowitych, ale same liczby całkowite nie mogą zostać zmienione.

Powiązane problemy