Форум сайта python.su
0
Добрый день!
Прошу объяснить причину разных решений, по сути одного кода.
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]]
Офлайн
0
Оба кода работают одинакого, просто тебе очень повезло и выпало 2, 9 во всех массивах
Код
[[0, 0]] * 3
[[0,0]] + [[0,0]] + [[0,0]]
>> [[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)
Офлайн
4
во втором случае у вас в A три раза лежит один и тот же список, в чем вы можете убедиться сами -
a = [[0,0]] * 3
id(a[0]) == id(a[1])
или
a[0] is a[1]
Офлайн
4
dredsssВы совершенно не правы
Оба кода работают одинакого, просто тебе очень повезло и выпало 2, 9 во всех массивахКод
Офлайн
0
т.е создавая список способоми: А=[,] и A=[]*2 я получаю два разных списка по сути, по причине ссылочного принципа организации списка?
Офлайн
0
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 >>>
Офлайн
0
SlowПосле переопределения одного из элементов, его ИД изменится. Для экономии памяти питон и не на это способен
>> a = 1 >> b = 1 >> c = 1 >> d = 1 >> id(a) == id(b) == id(c) == id(d) True
Офлайн
4
dredsssкхм.
Офлайн
0
SlowCPython - немного не python.
Отредактировано dredsss (Окт. 26, 2018 19:43:57)
Офлайн
1
dredsssДа????? А что это???
CPython - немного не python
CPython — наиболее распространённая, де-факто эталонная реализация языка программирования Python. CPython является интерпретатором байт-кода, написан на C.
Офлайн