Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2018 13:40:24

did.vasiliy
Зарегистрирован: 2018-10-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Принцип заполнения списка

Добрый день!
Прошу объяснить причину разных решений, по сути одного кода.

 import random
A=[[0,0],[0,0],[0,0]]
print(A)
for i in range(len(A)):
    x1=random.randint(1,12)
    x2=random.randint(1,12)  
    A[i][0]=x1
    A[i][1]=x2
print(A)
[[0, 0], [0, 0], [0, 0]]
[[5, 6], [11, 11], [5, 1]]
 import random
A=[[0,0]]*3
print(A)
for i in range(len(A)):
    x1=random.randint(1,12)
    x2=random.randint(1,12)
    A[i][0]=x1
    A[i][1]=x2
print(A)
[[0, 0], [0, 0], [0, 0]]
[[2, 9], [2, 9], [2, 9]]

Офлайн

#2 Окт. 26, 2018 14:08:36

dredsss
Зарегистрирован: 2018-10-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Принцип заполнения списка

Оба кода работают одинакого, просто тебе очень повезло и выпало 2, 9 во всех массивах
Код

 [[0, 0]] * 3
Тоже, что и
 [[0,0]] + [[0,0]] + [[0,0]]
При сложении массивов они объединяются в 1, складываю только свои элементы, поэтому
  >> [[0,0]] + [[0,0]] + [[0,0]] == [[0, 0]] * 3
True
 >>> [[0,0]] + [[0,0]] + [[0,0]]
[[0, 0], [0, 0], [0, 0]]

Отредактировано dredsss (Окт. 26, 2018 14:09:44)

Офлайн

#3 Окт. 26, 2018 14:09:48

Slow
Зарегистрирован: 2017-07-26
Сообщения: 88
Репутация: +  4  -
Профиль   Отправить e-mail  

Принцип заполнения списка

во втором случае у вас в A три раза лежит один и тот же список, в чем вы можете убедиться сами -

a = [[0,0]] * 3
id(a[0]) == id(a[1])
или
a[0] is a[1]

Офлайн

#4 Окт. 26, 2018 14:11:10

Slow
Зарегистрирован: 2017-07-26
Сообщения: 88
Репутация: +  4  -
Профиль   Отправить e-mail  

Принцип заполнения списка

dredsss
Оба кода работают одинакого, просто тебе очень повезло и выпало 2, 9 во всех массивахКод
Вы совершенно не правы

Офлайн

#5 Окт. 26, 2018 14:20:45

did.vasiliy
Зарегистрирован: 2018-10-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Принцип заполнения списка

т.е создавая список способоми: А=[,] и A=[]*2 я получаю два разных списка по сути, по причине ссылочного принципа организации списка?

Офлайн

#6 Окт. 26, 2018 14:26:21

did.vasiliy
Зарегистрирован: 2018-10-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Принцип заполнения списка

Slow
во втором случае у вас в A три раза лежит один и тот же список, в чем вы можете убедиться сами -

Спасибо!
 >>> A=[[0,0]]*3
>>> id(A[0]) == id(A[1])
True
>>> A=[[0,0],[0,0]]
>>> id(A[0]) == id(A[1])
False
>>>

Офлайн

#7 Окт. 26, 2018 19:20:15

dredsss
Зарегистрирован: 2018-10-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Принцип заполнения списка

Slow
После переопределения одного из элементов, его ИД изменится. Для экономии памяти питон и не на это способен
 >> a = 1
>> b = 1
>> c = 1
>> d = 1
>> id(a) == id(b) == id(c) == id(d)
True

Офлайн

#8 Окт. 26, 2018 19:26:43

Slow
Зарегистрирован: 2017-07-26
Сообщения: 88
Репутация: +  4  -
Профиль   Отправить e-mail  

Принцип заполнения списка

dredsss
кхм.
cpython особым образом работает с int. настоятельно рекомендую изучить вопрос, прежде чем делать не относящиеся к делу заявления.

Офлайн

#9 Окт. 26, 2018 19:43:41

dredsss
Зарегистрирован: 2018-10-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Принцип заполнения списка

Slow
CPython - немного не python.
Я нормально знаю то, почему id одинаковый у одинаковых int'ов. Разве я кинул этот ответ в топик CPython?

Отредактировано dredsss (Окт. 26, 2018 19:43:57)

Офлайн

#10 Окт. 26, 2018 20:36:20

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Принцип заполнения списка

dredsss
CPython - немного не python
Да????? А что это???

CPython — наиболее распространённая, де-факто эталонная реализация языка программирования Python. CPython является интерпретатором байт-кода, написан на C.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version