2015-08-21 20 views
7

Я видел людей, используя [:] сделать ласточкин копию списка, например:Присвоить значение списка с помощью ломтика нотацию с правопреемника

>>> a = [1,2,3,4] 
>>> b = a[:] 
>>> a[0] = 5 
>>> print a 
[5, 2, 3, 4] 
>>> print b 
[1, 2, 3, 4] 

Я понимаю, что. Тем не менее, я видел pleople, используя эти обозначения при назначении списков, а также, как:

>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> a[:] = b 
>>> print a 
[4, 5, 6, 7] 
>>> print b 
[4, 5, 6, 7] 

Но я не понимаю, почему они используют [:] здесь. Есть ли разница, которую я не знаю?

ответ

7

Там действительно является разницей между a[:] = b и a = b.

>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> c = [8,9,0,1] 
>>> c = b 
>>> a[:] = b 
>>> b[0] = 0 
>>> a 
[4, 5, 6, 7] 
>>> c 
[0, 5, 6, 7] 
>>> 

Когда вы пишете a = b, а есть ссылка на тот же список, как б: любое изменение Ь затронет

когда вы пишете a[:] = b а есть список инициализируется с элементами Ъ: изменение в б не повлияет на


и также разницу между a[:] = b и a = b[:].

>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> c = a 
>>> a = b[:] 
>>> a 
[4, 5, 6, 7] 
>>> c 
[1, 2, 3, 4] 
>>> a = [1,2,3,4] 
>>> b = [4,5,6,7] 
>>> c = a 
>>> a[:] = b 
>>> a 
[4, 5, 6, 7] 
>>> c 
[4, 5, 6, 7] 

С a = b[:], вы создаете новый список с элементами из Ь, если другая переменная указала на него не влияет

С a[:] = b, вы меняете элементы а. Если другая переменная указала на нее, она также будет изменена.

2

Это больше о том, как он копирует список, чем что-либо. Пример:

>>> a = [1, 2, 3, 4] 
>>> b = [4, 5, 6, 7] 
>>> a = b 
>>> b[0] = 9 
>>> a 
[9, 5, 6, 7] 
>>> b 
[9, 5, 6, 7] 

Здесь a Теперь ссылки b, поэтому изменение значения b также будет влиять на a.

>>> a = [1, 2, 3, 4] 
>>> b = [4, 5, 6, 7] 
>>> a[:] = b 
>>> b[0] = 9 
>>> a 
[4, 5, 6, 7] 
>>> b 
[9, 5, 6, 7] 

В случае использования нарезки, это только неполная копия элементов списка, поэтому изменение b не повлияет на a. Надеюсь, что помогает разобраться.

+1

Это неглубокая копия в вашем втором примере, первая создает ссылку –

+1

Исправлено, спасибо за исправление – maccartm

4

Да, когда вы используете [:] в левой части, он изменяет (изменяет) список на месте вместо того, чтобы назначать новый список имени (переменной). Для этого попробуйте ввести следующий код:

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

Вы увидите как 'a', так и 'b'.

Чтобы увидеть разницу между выше и нормальное распределение, попробуйте следующий код из -

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

Вы увидите, что только «а» изменился, «б» по-прежнему указывают на [1,2,3,4]

+0

Я думаю, вы имеете в виду, что я не увижу, что оба изменились?Поскольку 'a [:]' является самой ласточкой, которая больше не указывает на 'b'? – XNor

+0

Попробуйте сначала. –

+1

При использовании в левой части оператора присваивания они не создают копии. Они предназначены для изменения списка. –

Смежные вопросы