Jaka jest różnica pomiędzy

list = range(100)

I

list[:] = range(100)

W Pythonie?

EDYTUJ

Powinienem był wspomnieć o tym, zanim zmienna listy przypisania została już przypisana do listy:

list = [1, 2, 3]
list = range(100)

Lub

list = [1, 2, 3]
list[:] = range(100)
16
Max 6 październik 2011, 20:12

5 odpowiedzi

Pierwszy przedstawia wbudowaną nazwę list, aby wskazać na pewną listę.

Drugi kończy się z TypeError: 'type' object does not support item assignment.

4
Josh Lee 6 październik 2011, 16:15

list[:] Określa zakres na liście, w tym przypadku określa pełną gamę listy, tj. Cała lista i ich zmienia. Z drugiej strony list=range(100) Z drugiej strony, rodzaj wycierania oryginalnej zawartości list i ustawia nową zawartość.

Ale wypróbuj:

a=[1,2,3,4]

a[0:2]=[5,6]

a # prints [5,6,3,4]

Widzisz, zmieniamy dwa pierwsze elementy z zadaniem. Oznacza to, że przy użyciu tej notacji można raz zmienić kilka elementów na liście.

2
phimuemue 6 październik 2011, 16:13

list[:] będzie działać tylko wtedy, gdy jest już obiekt o nazwie list, który umożliwia przypisanie plasterków.

Ponadto, nie powinieneś nazwać zmienne list, ponieważ istnieje wbudowany nazwany list, który jest typ list.

2
Michael Hoffman 6 październik 2011, 16:15

[:] jest również przydatny do wykonania głębokiej kopii listy.

def x(l):
    f=l[:]
    g=l
    l.append(8)
    print "l", l
    print "g", g
    print "f", f

l = range(3)

print l
 #[0, 1, 2]

x(l)
 #l [0, 1, 2, 8]
 #g [0, 1, 2, 8]
 #f [0, 1, 2]

print l
#[0, 1, 2, 8]

Modyfikacja La znajduje się odzwierciedlenie w G (ponieważ oba wskazuje na tę samą listę, w rzeczywistości zarówno G, jak i L są tylko nazwami w Pythonie), a nie w F (ponieważ jest to kopia L)

Ale w twoim przypadku nie ma żadnej różnicy. (Choć nie kwalifikuję się do komentowania żadnych wykorzystania pamięci obu metod.)

Edytować

h = range(3)
id(h) #141312204 
h[:]=range(3)
id(h) #141312204 
h=range(3)
id(h) #141312588 

Lista [:] = zakres (100) aktualizuje listę list = zakres (100) tworzy nową listę.

@AGF: Dzięki za wskazanie mojego błędu

2
Arun Karunagath 6 październik 2011, 16:43
list[:] = range(100)

Nie będzie działać na niezainicjowanej zmiennej, jak go modyfikuje. [:] Określa całą listę / zoupłat.

1
Griwes 6 październik 2011, 16:14