Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 1, 2014 07:57:39

mojahed
Зарегистрирован: 2014-02-01
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Казус с обработкой списков.

Здравствуйте всем.
Имею исходный список:
a2 = [, , , ]
Мне в нем надо нечто вроде брут форса менять либо в столбцах, либо в строках данные.
Делаю копию: atl40 = list(a2) либо atl40 = a2 без разницы.
Передаю эту копию в функцию. Там завожу рабочую копию для подстановки
global ay
ay = ax
Произвожу подстановку в рабочем списке ау. Как то так:
def install_ch(ax, dx, np, sem, nsp, nr):
bufx = dx
j=0
global ay
ay = ax
if sem == 1: #strinf здесь подстановка
for i in range(4):
if ax == 0:
ay = bufx
j +=1
После отработки функции имею подстановку значений во всех трех списках a2, atl40, ay,
хотя этого не должно быть. Id у всех трех списков разные, я проверял. Почему? Что я делаю не так?
Idle 3.3.3.

Офлайн

#2 Фев. 1, 2014 08:20:30

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

Казус с обработкой списков.

mojahed
Что я делаю не так?
Не используете при редактирования кода теги <>. Так ваш код почти никто и читать не станет.
mojahed
atl40 = a2
Это точно не копия а назначение alias имени для того-же списка. Азы питона. При помощи оператора id всегда можете посмотреть куда ссылаетесь.
a=2
b=[]
c=b
print(id(b))
print(id(c))



Отредактировано doza_and (Фев. 1, 2014 08:21:21)

Офлайн

#3 Фев. 1, 2014 10:06:56

mojahed
Зарегистрирован: 2014-02-01
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Казус с обработкой списков.

Спасибо за помощь. Уже разобрался. Про Id знаю и писал в сообщении. Проблему решил tuple - list и наоборот.

Офлайн

#4 Фев. 1, 2014 10:38:21

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Казус с обработкой списков.

глубокую копию списка позволяет делать метод copy.deepcopy(list) модуля copy

Офлайн

#5 Фев. 1, 2014 21:40:02

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Казус с обработкой списков.

а использование list(spisok) не создает новую полную копию списка spisok?

Офлайн

#6 Фев. 2, 2014 02:32:00

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Казус с обработкой списков.

Это вопрос или наставление? Проверьте

d = {1:1}
L = list([d])
d[1] = 2
print(L)

Офлайн

#7 Фев. 2, 2014 06:11:42

mojahed
Зарегистрирован: 2014-02-01
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Казус с обработкой списков.

Может я не совсем правильно сформулировал проблему в топике.
Речь идет о том что. при обработке копии списка все изменения имеют место и в оригинале и во 2й копии несмотря на то что все три объекта имеют разные Id. У основоположников про это внятно не говорится. Я для себя проблему закрыл list<==>tuple. Топик можно считать закрытым.

Офлайн

#8 Фев. 2, 2014 12:03:52

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Казус с обработкой списков.

Ну я вам выше в посте #4 написал, как это по-уму делают, а не велосипедят.

Офлайн

#9 Фев. 2, 2014 13:29:24

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Казус с обработкой списков.

Делаю копию: atl40 = list(a2) либо atl40 = a2 без разницы.
Я один считаю что это примерно так *ptr1 = *ptr2?
Да и вот

Офлайн

#10 Фев. 2, 2014 21:09:52

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Казус с обработкой списков.

>>> что все три объекта имеют разные Id.
имеют. Но надо смотреть, что внутри. Там могут быть объекты с общими ссылками. Надо понимать разницу между гладкой и глубокой копией объектов. Последняя достигается рекурсивным обходом и копированием каждого нуждающегося в этом объекте на максимально возможную глубину. Ладно вобщем, сколько можно, ясно всё.

Отредактировано dimy44 (Фев. 2, 2014 21:16:00)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version