Учебник серии Python 127 — ссылка против копии

искусственный интеллект задняя часть

Друзья, если вам нужно перепечатать, пожалуйста, указывайте источник:blog.CSDN.net/Генерал сказал, о...

Отказ от ответственности: во время обучения технологии искусственного интеллекта многие студенты задавали мне некоторые вопросы, связанные с Python, поэтому, чтобы дать студентам более обширные знания и лучшее понимание технологии искусственного интеллекта, я попросил своего помощника поделиться этой серией. учебников по python Надеюсь, поможет всем! Поскольку этот учебник по Python написан не мной, он не такой забавный и юмористический, как мой курс по технологии искусственного интеллекта, и его более скучно изучать; но его знания все еще на месте, и его стоит прочитать! PS: Для студентов, которые не понимают эту статью, пожалуйста, сначала прочитайте предыдущую статью, и вам не составит труда учиться понемногу каждый день шаг за шагом!

Ранее мы упоминали, что операции присваивания хранят ссылки на объекты, а не копии этих объектов. Поскольку операции присваивания создают несколько ссылок на объект, изменение объекта может повлиять на другие ссылки на объект в другом месте программы. Если вы не хотите менять все это, вам нужно явно указать Python скопировать объект, а не просто присвоить его.

Например, в следующем примере создается список X и другой список L, в который вложены ссылки на список X. Кроме того, создается словарь D, содержащий еще одну ссылку на список X.

>>> X = [1,2,3]

>>> L = ['a',X,'b']  # Embed references to X's object

>>> D = {'x':X,'y':2}

В приведенном выше коде есть три ссылки на один и тот же список объектов: X, второй элемент L и первый элемент D.

Поскольку список, на который ссылается переменная X, также упоминается в L и D, поскольку список является изменяемым, изменение любого из трех объектов списка, на которые ссылаются, также изменит два других объекта, на которые ссылаются.

>>> X[1] = 'surprise'  # Changes all three references!

>>> L

['a',[1,'surprise',3],'b']

>>> D

{'x': [1,'surprise',3],'y': 2}

В большинстве случаев эта особенность ссылок нам выгодна, потому что вы можете передавать большие объекты в любом месте области действия программы без необходимости делать копии по пути, что экономит память и повышает производительность. Однако, если вам не нужна эта функция «одно изменение — все изменения», вам необходимо явно копировать-копировать.

• Неограниченные выражения среза (L[:]) могут копировать последовательности. • Метод копирования словаря (X.copy()) может копировать словарь. • Некоторые встроенные функции (например, list) также могут генерировать копии (list(L)).

Например, допустим, у вас есть список и словарь, и вы не хотите изменять их значения через ссылки на другие переменные.

>>> L = [1,2,3]

>>> D = {'a':1,'b':2}

Вместо копирования по ссылке вы можете присвоить копии другим переменным.

>>> A = L[:]     # Instead of A = L (or list(L))

>>> B = D.copy()  # Instead of B = D (ditto for sets)

Таким образом, изменения, сделанные другими переменными, изменят только копию, а не исходный объект.

>>> A[1] = 'Ni'

>>> B['c'] = 'spam'

>>>

>>> L,D

([1,2,3],{'a': 1,'b': 2})

>>> A,B

([1,'Ni',3],{'a': 1,'c': 'spam','b': 2})

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

>>> X = [1,2,3]

>>> L = ['a',X[:],'b']   # Embed copies of X's object

>>> D = {'x':X[:],'y':2}

L и D теперь будут указывать на разные списки вместо X. Таким образом, изменения, сделанные через X, могут повлиять только на X, а не на L и D. Точно так же изменение L или D не повлияет и на X.

Следует отметить, что фрагментация безусловных значений и метод копирования словаря могут выполнять только копирование верхнего уровня. То есть вложенные структуры данных не могут быть скопированы. Если вам нужно сделать полную копию глубоко вложенной структуры данных, используйте стандартный модуль копирования - сначала импортируйте копию, затем выполните X = copy.deepcopy(Y) для завершения копирования любого вложенного объекта Y. Этот оператор вызова может рекурсивно перемещаться по объектам для копирования всех их компонентов.