LINUX.ORG.RU

Что это за магия в питоне?

 


0

2
>>> array = []
>>> current_pos = [1, 1]
>>> array.append(current_pos)
>>> print(array)
[[1, 1]]
>>> current_pos[0] = current_pos[0] + 12
>>> current_pos[1] = current_pos[1] + 11
>>> print(current_pos)
[13, 12]
>>> array.append(current_pos)
>>> print(array)
[[13, 12], [13, 12]]

Куда девается элемент со значением [1,1]? Причём так можно продолжать до бесконечности и менять значение current_pos как угодно, все элементы в array будут иметь значение последнего current_pos. непонятно. о.О

★★★

Куда девается элемент со значением [1,1]

Ты его изменил, добавил 12 и 11 к его подэлементам.

vurdalak ★★★★★
()
Ответ на: комментарий от hope13

Не понимаю вопроса.

Ты записал в array три раза одну и ту же переменную. Соответсвенно при её изменении она будет изменяться везде.

vurdalak ★★★★★
()

Ты его изменяешь вот тута вот:


[[1, 1]]:>
>>> current_pos[0] = current_pos[0] + 12
>>> current_pos[1] = current_pos[1] + 11
Ты когда аппендишь в массив уже созданный объект, то он передаётся по ссылке, и любое его изменение по этой ссылке меняет содержимое объекта во всех местах одновременно (грубо говоря).

menangen ★★★★★
()

current_pos — это один и тот же список. Необходимо создать новый.

>>> array = []
>>> current_pos = [1, 1]
>>> array.append(current_pos[:])
>>> print(array)
[[1, 1]]
>>> current_pos[0] = current_pos[0] + 12
>>> current_pos[1] = current_pos[1] + 11
>>> print(current_pos)
[13, 12]
>>> array.append(current_pos[:])
>>> print(array)
[[1, 1], [13, 12]]
>>> 

Kilte ★★★★★
()
Ответ на: комментарий от vurdalak

Ну представь,что я изменяю current_pos в цикле и вывожу его в консоль(каждый раз значение получается), тут же присоединяю к array. И получаю array с одинаковыми значениями. Как это может быть?

Почему так работает(в чём разница):

>>> bla = [0,0]
>>> bla
[0, 0]
>>> array.append(bla)
>>> array
[[0, 0]]
>>> bla = [12, 12]
>>> bla
[12, 12]
>>> array.append(bla)
>>> array
[[0, 0], [12, 12]]
>>> array.append(bla)
>>> array
[[0, 0], [12, 12], [12, 12]]

hope13 ★★★
() автор топика
Ответ на: комментарий от hope13

Читал бы туториал, то это для тебя не было бы неожиданностью.

itn ★★★
()
Ответ на: комментарий от hope13

bla = [12, 12]

Ты записал в переменную bla новый список.

array.append(bla)

Ты добавил в список то что лежит в переменной bla. Не скопировал, а добавил указатель.

Чтобы понимать принцип, желательно сначала изучить как устроены списки.

vurdalak ★★★★★
()

В питоне есть понятие mutable, и список к ним тоже относится. Почитай буквари об этом, ибо пхпшника могут подстерегать и другие сюрпризы.

И да, список и массив это большая разница.

redixin ★★★★
()
Ответ на: комментарий от hope13

просто неожиданное поведение.

Напротив, это единственно правильное, последовательное поведение.

Deleted
()
Ответ на: Xoook от redixin

Что ты триггеришься сразу, я совершенно беззлобно высказался.

Использование сишки предполагает, что пользователь в состоянии сам следить за памятью.

Deleted
()
Ответ на: Xoook от redixin

СИ — скриптопарашный язык.

Ну-ну. Совершенно чётко указано, из элементов какого типа состоит myarr, в отличии от :) Не умеешь в указатели и массивы, путаешь адрес переменной с её содержимым - не берись. :)

Stanson ★★★★★
()
Ответ на: комментарий от redixin

Перечитай стартовый пост, потом перечитай пост на который это был ответ, а потом подумай еще раз.

Во-во, именно это тебе и стоит сделать. Может поймёшь, чем отличаются языки на которых написано 90% софта от всяких скриптопарашных языков для вебмакак типа пистона.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Я понял, ты не толстый а просто глупый. Гуляй.

redixin ★★★★
()

Что это за магия в питоне?

Это не магия, это отсутствие логики у кодопейсателя.

Siado ★★★★★
()
Ответ на: комментарий от orionit

видимо теперь не модно читать - модно писать всюду подобные вопросы

p00h
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.