2015-09-08 8 views
5

ich quer durch den folgenden Code kam:Was für Liste Kolon bei Zuordnung tut [:] = [...] tun in Python

# O(n) space  
def rotate(self, nums, k): 
    deque = collections.deque(nums) 
    k %= len(nums) 
    for _ in xrange(k): 
     deque.appendleft(deque.pop()) 
    nums[:] = list(deque) # <- Code in question 

Was nums[:] = macht, dass nums = nicht? Was macht nums[:] das nicht tun nums nicht?

+0

gestellte Auslassungszeichen ersetzen und beantwortet Ich glaube. [Was bedeutet \ [: \] in Python?] (Http://stackoverflow.com/questions/6167238/what-does-in-python-mean) – CollinD

+1

@CollinD Habe diese Frage nicht gesehen, danke. Aber immer noch nicht beantwortet die Aufgabe Frage –

+0

Ich hatte beschlossen, wieder zu öffnen, weil ich nicht glaubte, dass die verknüpfte Duplikat Slice-Zuweisung erklärt. Ich muss den falschen Link geöffnet haben, weil es definitiv Slice-Zuweisung erklärt. –

Antwort

15

Diese Syntax ist ein Stück Zuordnung. Ein Stück von [:] bedeutet die gesamte Liste. Der Unterschied zwischen nums[:] = und nums = besteht darin, dass letzteres Elemente in der ursprünglichen Liste nicht ersetzt. Dies ist zu beobachten, wenn es zwei Verweise auf die Liste sind

>>> a = list(range(10)) 
>>> b = a 
>>> a[:] = [0, 0, 0] # changes what a and b both refer to 
>>> b 
[0, 0, 0] 

der Unterschied sehen nur die [:] aus der obigen Reihenfolge entfernen.

>>> a = list(range(10)) 
>>> b = a 
>>> a = [0, 0, 0] # a now refers to a different list than b 
>>> b 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

den Titel Ihrer Frage wörtlich zu nehmen, wenn list ein Variablenname und nicht die builtin, wird die Länge der Sequenz mit einem

>>> list = [1,2,3,4] 
>>> list[:] = [...] 
>>> list 
[Ellipsis] 
+0

Einfach sagen, (Liste [:] = ...) ist Werttyp, aber (Liste = ...) ist Referenztyp –

+1

@Brady Huang, die dies nicht genau beschreibt –

3

nums = foo bindet den Namen nums an das gleiche Objekt, auf das sich foo bezieht.

ruft die Slice-Zuweisung für das Objekt auf, auf das sich nums bezieht, wodurch der Inhalt des ursprünglichen Objekts eine Kopie des Inhalts von foo wird.

Versuchen Sie folgendes:

>>> a = [1,2] 
>>> b = [3,4,5] 
>>> c = a 
>>> c = b 
>>> print(a) 
[1, 2] 
>>> c = a 
>>> c[:] = b 
>>> print(a) 
[3, 4, 5]