Странный конкретный случай изменяющегося списка в Python 2.7 - общие решения, похоже, не работают [дубликаты]

Я просмотрел ряд тем, посвященных мутации и мутации списка, и все же я столкнулся с примером, что ни один из тех, что я смог найти, не разрешается. В частности, я экспериментировал с вложенным индексированием, поэтому я создал объект запутанного списка, который, вероятно, был бы «плохой практикой» в реальном мире. Но просто для обучения я хотел создать примеры индексов и решил также проверить их на мутацию. Этот объект видоизменяется, когда вы пытаетесь его скопировать (см. код ниже). Среди вещей, которые я пытался обойти, но которые не увенчались успехом, были следующие:

  1. Документация Python описывает copy() и deepcopy(), но оказывается, что эти методы не существуют в списке (по крайней мере, это ошибка, которую я получаю).

  2. x2 = x[:] должен решить проблему путем нарезки. Это тоже не работает с объектом, приведенным ниже (он все еще мутирует)

  3. list2 = list(list1) - это работает с простыми списками, но не с сумасшедшим списком хранения смешанных объектов, приведенным ниже

Как бы я скопировал что-то подобное и не мутировал?

Я не рассчитываю когда-либо создать что-то подобное на самом деле, но меньшие смешанные списки объектов с теми же симптомами, вероятно, имеют допустимые варианты использования в реальном коде. Кто сможет это взломать, будем признательны...

Этот код был в блокноте Jupyter с Python 2.7:

import numpy as np
import pandas as pd

m3d=np.random.rand(3,4,5)
n3d=m3d.reshape(4,3,5)
o3d=np.random.rand(2,3,4,5)

# some simple arrays:
simp1=np.array([[1,2,3,4,5]])
simp2=np.array([[10,9,8,7,6]])
simp3=[11,12,13]

# a dictionary
dfrm1 = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002],
        'population': [1.5, 1.7, 3.6, 2.4, 2.9]}
# convert dictionary to DataFrame
dfrm1 = pd.DataFrame(dfrm1)

trueSimp1=np.array([10,9,8,7,6])

crazyList = [simp1, m3d, simp2, n3d, simp3, dfrm1, o3d, trueSimp1]

Теперь, как мы создадим CrazyList2, чтобы он не мутировал после создания копии?

Среди неудачных попыток:

crazyList2 = list(crazyList)
crazyList3 = crazyList[:]

crazyList4 = crazyList[:-1]
crazyList4 = crazyList4.append(crazyList[7]) # 7 is last object in list

Чтобы проверить это... некоторые хорошие элементы нужно изменить в каждом списке и посмотреть, влияют ли они на другие:

crazyList3[7][1] = 13  # change value here in any one list and check the others
crazyList3[4][0] = 14  # change value here in any one list and check the others

В моих тестах они всегда это делали... доказывая мутацию, несмотря на разные способы, которыми я пытался ее обойти.


person TMWP    schedule 23.02.2017    source источник
comment
Вы выполняете мелкую копию, и ваш список содержит изменяемые элементы. Вам нужен deepcopy.   -  person Łukasz Rogalski    schedule 23.02.2017
comment
Вы должны import copy и вызывать copy.deepcopy(list) Списки не имеют метода copy или deepcopy (в python2)   -  person danidee    schedule 23.02.2017
comment
спасибо за эти посты. Почему эта онлайн-документация не начинается с библиотеки, которую нужно импортировать для копирования/глубокого копирования, мне непонятно. :-) docs.python.org/2/library/copy.html   -  person TMWP    schedule 23.02.2017
comment
@danidee - у меня сейчас проблема на этом сайте. Кажется, люди отвечают на мои сообщения в комментариях и даже тратят время на внесение в них полезных правок, но не голосуют и не публикуют ответы. Это приводит к тому, что нули в этих вопросах усредняются таким образом, что я получаю предупреждение о том, что в ближайшее время я не смогу задавать здесь вопросы. Я новичок и просто хочу внести свой вклад и получить помощь от сообщества. Вы знали, что система работала таким образом, когда вы оставили вопрос равным нулю и ответили в комментарии, а не в сообщении?   -  person TMWP    schedule 14.03.2017
comment
Привет @TMWP. Это пять основных причин, по которым люди оставляют комментарии к вопросу (по крайней мере, для меня). 1. Вопрос является дубликатом, поэтому они просто дают подсказки, чтобы направить вас. 2. Ваша проблема/вопрос вызваны чем-то, что не воспроизводимо (в основном опечатка) 3. Они не считают, что их ответ следует публиковать как ответ, потому что он слишком короткий (или это похожие вопросы, на которые не имеет смысла публиковать новый ответ ... Относится к нет. 1) 4. Им нужно разъяснение 5. Они не уверены в ответе, но чувствуют, что могут чем-то помочь.   -  person danidee    schedule 16.03.2017
comment
Stackoverflow - это не только репутация (хотя приятно видеть, что ваша репутация растет), но, в конце концов, представители - это просто интернет-точки, находящиеся где-то в базе данных, которые можно легко стереть, если произойдет апокалипсис: D. Я хочу сказать, что от Stackoverflow можно получить гораздо больше, чем от репутации, поэтому я умоляю вас не отчаиваться и продолжать участвовать (отвечая и спрашивая). Мой первый вопрос несколько лет назад был «Как я могу создать сайт потоковой передачи музыки с помощью PHP». Я получил около 7 отрицательных голосов за 2 минуты, и мне запретили задавать вопрос, пока я не отвечу, чтобы отменить дефицит.   -  person danidee    schedule 16.03.2017
comment
На Stackoverflow так много пользователей с несправедливой репутацией (большинство из которых было получено, когда сайт был еще молодым). но сегодня все по-другому, люди не голосуют за вопросы (и ответы) так часто, как раньше. Поэтому, если вы действительно хотите, чтобы ваша репутация росла быстрее, лучше всего отвечать на больше вопросов. Вот пример вопроса, в котором было получено много несправедливой репутации stackoverflow.com/questions/1024847/ еще в 2009 году. Вы не можете назвать это несправедливым, потому что ну.... Они были до вас :). Я все еще надеюсь, что вы увидите вас вокруг Cheers!   -  person danidee    schedule 16.03.2017
comment
Спасибо за Ваш ответ. Вас могут заинтересовать несколько вещей, которые я узнал, делая похожие посты по другим вопросам. Несколько человек признались, что комментировали вместо того, чтобы отвечать, опасаясь, что за их ответ проголосуют отрицательно (раньше их уже кусали). В моем случае людям понравился вопрос достаточно, чтобы углубиться в него с полезными предложениями и даже отредактировать контент, чтобы он выглядел лучше, или для придирчивых грамматических и стилистических проблем, иногда действительно улучшающих читабельность, а иногда нет, и все же после того, как потрачено все это время на мой вопрос, до сих пор нет голосования или опубликованного ответа ...   -  person TMWP    schedule 16.03.2017
comment
Я считаю, что сейчас мне удалось решить свой дефицит, но делать это, отвечая на большее количество вопросов, рискованно из-за проголосовавших против. Хотя этот сайт не о репутации, различные возможности использования сайта и участия в нем начисляются и / или отнимаются в зависимости от того, сколько у вас очков репутации. Если вы упадете ниже маржи, вы потеряете привилегии. Наращивая свои числа, вы их получаете. Если я когда-нибудь стану таким же, как опытные люди, с огромной подушкой, возможно, меня это не сильно волнует, но прямо сейчас я все еще развиваю способность к полноценному участию. Среди действий, которые я предпринял для устранения дефицита ...   -  person TMWP    schedule 16.03.2017