Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2015 21:58:09

Broglie
Зарегистрирован: 2015-12-27
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Что делает конструкция x=[[]]*3 ?

Для интереса залез в вакансии Яндекса и наткнулся на такой пример:

x = [[]]*3
x[0].append('a')
x[1].append('b')
x[2].append('c')
x[0]=['d']
print x
Я ожидал такого:
[['d'],['b'],['c']]
Но результат оказался иным:
[['d'], ['a', 'b', 'c'], ['a', 'b', 'c']]
Почему так?
P.S. В Яндекс не собираюсь, просто для себя интересно.

Отредактировано Broglie (Дек. 28, 2015 21:59:09)

Офлайн

#2 Дек. 28, 2015 22:25:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Что делает конструкция x=[[]]*3 ?

Broglie
Почему так?
>>> [id(i) for i in [[]]*3]
[20549760, 20549760, 20549760]



Отредактировано doza_and (Дек. 28, 2015 22:25:27)

Офлайн

#3 Дек. 29, 2015 02:03:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Что делает конструкция x=[[]]*3 ?

Broglie
Почему так?
В списке хранятся не сами объекты, а их адреса. Когда обращаешься к объекту в списке, происходит переход к этому объекту по его адресу . Это со всеми объектами происходит.

>>> lst = [1] * 3
>>> lst
[1, 1, 1]
>>> id(lst[0])
1287271584
>>> id(lst[1])
1287271584
>>> id(lst[2])
1287271584
>>>



Офлайн

#4 Дек. 29, 2015 21:49:12

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Что делает конструкция x=[[]]*3 ?

Вот так вот:

x = [[] for x in range(3)]
x[0].append('a')
x[1].append('b')
x[2].append('c')
x[0]=['d']
print x
input()
видает:


Вот так вот можно сделать так как вы ожидали.

Отредактировано A.N.Onim (Дек. 29, 2015 21:50:05)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version