2015-10-17 12 views
11

Podczas czytania profile.py standardowej biblioteki Pythona natknąłem się na instrukcję przypisania sys.argv[:] = args, która jest używana do modyfikacji sys.argv, aby program był profilowany, zobacz poprawne argumenty wiersza poleceń. Rozumiem, że różni się to od sys.argv = args[:] w rzeczywistych operacjach, ale w efekcie wyglądają tak samo dla mnie. Czy jest jakaś sytuacja, gdy chce się używać jednego, a nie drugiego? I jest a[:] = b wspólny idiom Pythona?Przypisywanie do kontra z plasterka

AKTUALIZACJA: w tej konkretnej sytuacji, dlaczego warto wybrać jedną nad drugą? (Źródło można znaleźć w funkcji main z profile.py)

Odpowiedz

9

Różnica jest, gdy używasz a[:] = b to oznacza, że ​​będzie zastąpić to, co jest już na a. Jeśli masz coś innego z odniesieniem do a, to również się to zmieni, ponieważ utrzymuje odniesienie do tej samej lokalizacji.

Z drugiej strony a = b[:] tworzy nowe odniesienie i kopiuje wszystkie wartości z b do nowego odwołania. Istniejące odniesienia do starych danych będą wskazywać na stare dane.

Rozważmy następujący przykład:

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> c = a # c is a reference to the list in a 
>>> c 
[1, 2, 3] 
>>> 
>>> a[:] = b 
>>> a # a will have a copy of the list in b 
[4, 5, 6] 
>>> C# and c will keep having the same value as a 
[4, 5, 6] 
>>> 
>>> b = [7, 8, 9] 
>>> a = b[:] 
>>> a # a has the new value 
[7, 8, 9] 
>>> C# c keeps having the old value 
[4, 5, 6] 
+0

Dziękuję, zdałem sobie sprawę, że to robi różnicę, czy istnieją inne odniesienia do 'A' –

+3

mogą być pomocne, aby dać przykład. Jeśli 'x = [1, 2, 3]' i 'a = x' (więc odnoszą się do tej samej listy), wykonanie' a = b [:] 'zastępuje _reference_ w' a' kopią 'b '; 'x' pozostaje niezmienione. Z drugiej strony, 'a [:] = b' zastępuje _contents_ z" a "(którego odniesienie jest niezmienione) z wartościami z' b', co oznacza, że ​​'x' jest również modyfikowany; link odniesienia nigdy nie został zerwany. – ShadowRanger

+0

Edytowałem, aby dodać więcej szczegółów. Ale przykład powinien być dobry. Dodam to. –

Powiązane problemy