2012-11-24 12 views
8
>>>a=[999999,2,3] 
    >>>b=[999999,2,3] 
    >>>print(a[0] is b[0]) 
    False#because it works for numbers -5 through 256 
    >>>a=[1,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#because it works for numbers -5 through 256 
    >>>a=[999999,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#why not False ??? 

co się stanie b = a [:] (dlaczego nie działa dla liczb od -5 do 256)?co się stało b = a [:] w pytonie?

+0

Chyba jesteś mylące dwie dziwne rzeczy: 1) 'b = a [:]' kopiuje odniesienia do wszystkich liczb całkowitych, więc 'b [0]' wskazuje na tę samą int, co 'a [0]', a 'a [0] to b [0]' zwraca 'True'. 2) numery pozycji od -5 do 256 są przechowywane przez cały czas. – Shep

Odpowiedz

11

-5 do 256 zasięg ma do czynienia z following:

Obecna implementacja utrzymuje tablicę obiektów całkowitą dla wszystkich liczb całkowitych między -5 i 256, po utworzeniu int w tym przedziale ty w rzeczywistości wystarczy odwołać się do istniejącego obiektu.

Aby to wykazać, zauważyć, jak id(123) utrzymuje powrót tą samą wartość, natomiast id(9999) może zwracać różne wartości:

In [18]: id(123) 
Out[18]: 9421736 

In [19]: id(123) 
Out[19]: 9421736 

In [20]: id(9999) 
Out[20]: 9708228 

In [21]: id(9999) 
Out[21]: 10706060 

Jest to oczywiście artefaktem bieżącej realizacji. Inna implementacja w języku Python może tego nie robić lub może używać innego zakresu.

Co do ostatniego przykładu:

In [14]: a=[999999, 2, 3] 

In [15]: b=a[:] 

In [16]: map(id, a) 
Out[16]: [10908252, 9421180, 9421168] 

In [17]: map(id, b) 
Out[17]: [10908252, 9421180, 9421168] 

Jak widać, [:] prostu kopiuje referencje. To wyjaśnia, dlaczego a[i] is b[i] ma wartość True dla wszystkich i.

+0

Powodem tego jest to, że liczby całkowite są niezmienne. – kindall

+0

Dla przykładu 'id (9999)' staje się jeszcze bardziej zagmatwany: spróbuj tego w zwykłym pytaniu Python 2.x zamiast IPython, a zobaczysz tę samą wartość za każdym razem (ponieważ ten sam przedział liczbowy jest ponowne użycie za każdym razem, istnienie historii w IPython oczywiście uniemożliwia to). –

0
a=[1,2,3] 

b=a tworzy b alias a. Oznacza to, że wszystkie zmiany b będą widoczne w a.

b = a [:] oznacza sporządzenie kopii a i przypisanie jej do b.

1
>>>b=a[:] 

Powoduje płytką kopię pozycji na liście a oraz nazw, które kopiują b. Wszystkie pozycje znajdujące się na nowej liście będą miały te same identyfikatory obiektów (wskaźniki myślowe), co elementy na oryginalnej liście. To jest oczekiwane zachowanie.

1

Dodawanie do @NPE's answer, tu jest ładny ilustracji:

a = range(-7, 259) 
b = range(-7, 259) 
for x, y in zip(a,b): 
    print x, x is y 

drukuje:

-7 False 
-6 False 
-5 True 
-4 True 
... 
255 True 
256 True 
257 False 
258 False 
Powiązane problemy