python: кажется, что импорт объекта непоследовательно удаляет существующий объект? - PullRequest
1 голос
/ 24 июня 2019

Итак, все началось с вопроса об импорте объектов данных с помощью команды import, и я знаю о таких вещах, как pickle и json, и всяких других способах сделать это, которые вполне могут быть лучшими вариантами, но при попытке получить В своем мозгу я обнаружил поведение, в котором, я уверен, есть логика, но я не могу понять, что это за логика. Поэтому я продемонстрирую на супер простом примере ...

У меня есть файл с именем "toimport.py", состоящий только из определения словаря:

foo = {
   "key1" : "value1",
   "key2" : "value2",
   "key3" : "value3",
}

Ниже я запускаю простую серию команд:

Сначала создайте словарь с именем «bar» и назначьте ему пару ключ / значение.

Во-вторых, импортируйте словарь в мой файл "toimport". Я не был уверен, затормозит ли импорт значение существующего ключа, похоже, что он делает:

Python 3.6.7 (v3.6.7:6ec5cf2, Oct 24 2018, 15:53:56) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.

 >>> bar = {"key1":"blue"}
 >>> print (bar)
{'key1': 'blue'}

 >>> from toimport import foo as bar
 >>> print (bar)                
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

ОК, так что, думаю, так работает импорт Python. Нет проблем. ;-) Но ... если я изменяю одно из значений в dict, а затем запускаю точно такую ​​же команду импорта ... на этот раз он НЕ забивает значение, которое я установил ранее:

>>> bar['key1'] = 'zoomie'
>>> print (bar)           
{'key1': 'zoomie', 'key2': 'value2', 'key3': 'value3'}

>>> from toimport import foo as bar
>>> print (bar)                
{'key1': 'zoomie', 'key2': 'value2', 'key3': 'value3'}

Я уверен, что есть вполне разумное объяснение этому, но я не могу понять это самостоятельно. ; -)

1 Ответ

1 голос
/ 24 июня 2019

«Забивание» - неправильный способ думать об этом.Как всегда, с переменными Python вы должны думать о names .

Сначала вы определяете словарь с именем «bar».Затем вы говорите: «импортируйте файл foo dict из toimport и назначьте ему строку имени».Таким образом, это переназначает "bar", чтобы указывать на словарь в toimport.

Далее, вы изменяете словарь.Не забывайте, что имена указывают на объекты, поэтому изменение значения одного из ключей в «баре» означает, что это значение изменится везде , что на этот словарь ссылаются.Если вы также импортировали диктант foo куда-то еще, эта ссылка также увидит изменение.

Итак, во второй раз, когда вы импортируете foo как bar, это, по сути, запрет;Вы изменили его в обоих местах, поэтому никаких изменений не требуется.«bar» уже является ссылкой на тот же словарь, и его повторный импорт не имеет значения.

...