Официально начать
Прежде всего, я введу здесь два новых небольших знания, которые будут использованы ниже. Одна из них — функция id(), а другая — оператор is. Функция id() предназначена для возврата адреса памяти объекта; она предназначена для сравнения, указывают ли ссылки на объекты двух переменных на один и тот же объект, пожалуйста, не путайте это с == здесь, == для сравнения значения двух переменных равны.
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> id(a)
38884552L
>>> a is b
False
>>> a == b
True
Слово «копия» имеет два названия, одно из которых транслитерируется в соответствии с его произношением и называется «копия», а другое в стандартном переводе называется «копия».
На самом деле, только на первый взгляд, копирование — это создание копии чего-либо, но во многих языках программирования, таких как Python, C++, это не так просто.
>>> a = 1
>>> b = a
>>> b
1
Глядя на приведенный выше пример, на первый взгляд кажется, что мы получаем две единицы, но если вы читали статью, которую я написал ранее, у вас должно сложиться впечатление предложения, то есть «переменные не имеют типа», переменные в Python - это метка , где у нас есть id(), чтобы увидеть, где они находятся в памяти.
>>> a = 1
>>> b = a
>>> b
1
>>> id(a)
31096808L
>>> id(b)
31096808L
Вы видите, что id(a) и id(b) равны, поэтому нет двух единиц, а только одна единица. Это просто две метки на единице, имена a и b, это явление. Обычно встречается в Python, это метод присваивания реализует "мнимое" копирование.Реальная ситуация - это ссылочное отношение между двумя переменными и одним и тем же объектом.
Давайте еще раз посмотрим на метод copy():
>>> a = {'name':'rocky','like':'python'}
>>> b = a.copy()
>>> b
{'name': 'rocky', 'like': 'python'}
>>> id(a)
31036280L
>>> id(b)
38786728L
Эй, конечно же, полученное b на этот раз отличается от исходного a.Это освободило еще одно место в памяти. Тогда мы будем рассуждать в это время. Хотя они одинаковы, они находятся в двух разных пространствах памяти, поэтому они не должны мешать друг другу. Если мы изменим b, то a должно остаться неизменным.
>>> b['name'] = 'leey'
>>> b
{'name': 'leey', 'like': 'python'}
>>> a
{'name': 'rocky', 'like': 'python'}
Результат точно такой же, как мы рассуждали выше, поэтому, если вы понимаете, что у объектов есть типы, у переменных нет типов, а переменные являются метками объектов, вы можете правильно вывести результаты, предоставленные Python.
Давайте посмотрим на следующий пример, пожалуйста, убедитесь, что вы понимаете вышеизложенное, когда смотрите вниз, в противном случае вас легко укачает.
>>> a = {'name':'rocky','like':'python'}
>>> b = a
>>> b
{'name': 'rocky', 'like': 'python'}
>>> b['name'] = 'leey'
>>> b
{'name': 'leey', 'like': 'python'}
>>> a
{'name': 'leey', 'like': 'python'}
Вы видите что-нибудь в приведенном выше примере? Объект словарного типа, соответствующий b, был изменен, и объект a также изменился. То есть, b = a приводит к тому, что две переменные ссылаются на один и тот же объект, но так ли это просто? Пожалуйста, откройте глаза и посмотрите вниз, вот и все.
>>> first = {'name':'rocky','lanaguage':['python','c++','java']}
>>> second = first.copy()
>>> second
{'name': 'rocky', 'lanaguage': ['python', 'c++', 'java']}
>>> id(first)
31036280L
>>> id(second)
38786728L
Здесь нет проблем со словами, как мы уже говорили, второй копируется из первого, и они относятся к двум объектам соответственно.
>>> second['lanaguage'].remove('java')
>>> second
{'name': 'rocky', 'lanaguage': ['python', 'c++']}
>>> first
{'name': 'rocky', 'lanaguage': ['python', 'c++']}
Вы нашли что-нибудь? Само собой разумеется, что язык второго в приведенном выше примере соответствует списку.Если я удалю значение в этом списке, должно быть изменено только второе.Почему я также должен изменить первый?Разве они не должны мешать каждому разное? Это удивительно? Это то, что мы говорили раньше? Тогда давайте попробуем другой ключ:
>>> second['name'] = 'leey'
>>> second
{'name': 'leey', 'lanaguage': ['python', 'c++']}
>>> first
{'name': 'rocky', 'lanaguage': ['python', 'c++']}
Принцип, упомянутый выше, действителен, так почему же это так? Да ладно, пусть наш id() снова дебютирует.
>>> id(first['name'])
38829152L
>>> id(second['name'])
38817544L
>>> id(first['lanaguage'])
38754120L
>>> id(second['lanaguage'])
38754120L
На самом деле, глубинная причина здесь связана со способом хранения данных в Python, я не буду здесь слишком много объяснять (на самом деле, я тоже этого не понимаю. Здесь нам нужно только знать, что когда copy() используется, список Этот вид объекта, состоящий из строк, чисел и т. д., по-прежнему копируется и ссылается, то есть маркируется, и не создает новый объект. Мы называем этот метод копирования мелким копированием (о, о Боже мой, наконец-то эта концепция. Подразумевается, что глубоко укоренившиеся проблемы не решены, и подразумевается, что есть способы решить укоренившиеся проблемы.
Действительно, в Python тоже есть глубокая копия, перед ее использованием нужно ввести модуль копирования, попробуем.
>>> import copy
>>> first = {'name':'rocky','lanaguage':['python','c++','java']}
>>> second = copy.deepcopy(first)
>>> second
{'name': 'rocky', 'lanaguage': ['python', 'c++', 'java']}
>>> second['lanaguage'].remove('java')
>>> second
{'name': 'rocky', 'lanaguage': ['python', 'c++']}
>>> first
{'name': 'rocky', 'lanaguage': ['python', 'c++', 'java']}
После использования глубокой копии это не ссылка.
напиши в конце
Для получения дополнительных материалов, пожалуйста, обратите внимание на публичный аккаунт «Python Space» и с нетерпением ждем общения с вами.