Различия между Словарем. Четкий и новый Словарь ()

Вы отсутствуете __ init __. py. Из учебного руководства Python:

__ init __. файлы py требуются, чтобы заставлять Python рассматривать каталоги как содержащий пакеты; это сделано для предотвращения каталогов с общим названием, таких как строка, от неумышленного сокрытия допустимых модулей, которые происходят позже путь поиска модуля. В самом простом случае, __ init __. py может просто быть пустым файлом, но он может также выполнить код инициализации для пакета или установить __ все __ переменная, описанная позже.

Помещенный пустой файл, названный __ init __. py в Вашем каталоге Models, и все должны быть золотыми.

29
задан Edward Brey 19 December 2015 в 06:22
поделиться

8 ответов

Dictionary.Clear () удалит все пары KeyValue в словаре. Выполнение new Dictionary () создаст новый экземпляр словаря.

Если и только если старая версия словаря не основана на другой ссылке, создание нового словаря приведет к созданию всего словарь, и его содержимое (которое не внедрено где-либо еще) доступно для очистки сборщиком мусора.

Dictionary.Clear () сделает пары KeyValue доступными для очистки.

На практике , оба варианта будут иметь очень похожие эффекты. Разница будет в том, что происходит, когда это используется в методе:

void NewDictionary(Dictionary<string,int> dict)
{
   dict = new Dictionary<string,int>(); // Just changes the local reference
}

void  ClearDictionary(Dictionary<string,int> dict)
{
   dict.Clear();
}

// When you use this...
Dictionary<string,int> myDictionary = ...; // Set up and fill dictionary

NewDictionary(myDictionary);
// myDictionary is unchanged here, since we made a new copy, but didn't change the original instance

ClearDictionary(myDictionary);
// myDictionary is now empty
35
ответ дан 28 November 2019 в 00:52
поделиться

Как уже было подробно описано, эффекты по существу сводятся к те же самые. Clear () и new оба дадут вам свежий Словарь, по сути отказавшись от ссылок на объекты внутри него, освободив их для сбора, если они стали некорневыми.

Технически , .Clear () будет иметь преимущество перед new , если вы собираетесь повторно заполнить словарь до того же размера, что и раньше. Это потому, что он уже был бы внутренне изменен, чтобы вместить количество объектов, которые у вас были в нем раньше. Создание нового словаря будет иметь новую внутреннюю хэш-таблицу с размером по умолчанию, и ее нужно будет повторно расширять по мере добавления в нее элементов.

Я бы также предложил, чтобы они сообщали совершенно иное намерение, и вам следует использовать .Clear () в своем коде, когда вы имеете дело с тем же контекстом, что и раньше. Создание нового словаря подразумевает, что вы собираетесь приступить к какой-то новой логике, имеющей дело с чем-то отличным от старого словаря, в то время как использование Clear () указывает, что да, вы действительно хотели просто сбросить все, что вы сделали пока что с ним.

20
ответ дан 28 November 2019 в 00:52
поделиться

Dictionary.Clear ()
Это удалит все пары ключ / значение в Словаре. Сборщик мусора очистит память для этих элементов во время следующего цикла сборки мусора. MSDN

new Dictionary ()
Создает новый объект Dictionary в памяти и отказывается от исходного объекта. Память будет очищена во время следующего цикла сборки мусора.

14
ответ дан 28 November 2019 в 00:52
поделиться

Я полагаю, что ключевое отличие состоит в том, что если вы вызовете Dictionary.Clear () , все ссылки на этот словарь будут удалены. Если вы используете new Dictionary () , то ссылка, с которой вы имеете дело в то время, будет очищена (в некотором смысле), но все другие места, где у вас есть ссылки, не будут, поскольку они все равно будут ссылаться к старому словарю.

Надеюсь, этот код просто иллюстрирует это:

public void Method()
{
    Dictionary<int, int> d1 = new Dictionary();

    d1.Add(1,1);
    d1.Add(2,3);

    Dictionary<int, int> d2 = d1;

    //this line only 'clears' d1
    d1 = new Dictionary();

    d1.Add(1,1);
    d1.Add(3,5);
    d2.Add(2,2);

    //writes '2' followed by '1'
    Console.WriteLine(d1.Count);
    Console.WriteLine(d2.Count);
}

Если бы я вместо этого вызвал d1.Clear () , то d1 и d2 остались бы синхронизированными, и последующие добавления были бы добавили к обоим. Вместо этого оба вызова WriteLine будут иметь вывод «3».

6
ответ дан 28 November 2019 в 00:52
поделиться

Я считаю, что .Clear () был предоставлен, поэтому, если ваш словарь отображается как свойство только для чтения, вы могли бы удалить все предметы. Однако, если это не так и у вас есть полный контроль, может быть проще просто создать экземпляр нового словаря. Между ними также может быть небольшая разница в производительности.

3
ответ дан 28 November 2019 в 00:52
поделиться

Dictionary.Clear удалит (но не удалит) все элементы в экземпляре, тогда как new Dictionary () создаст совершенно новый экземпляр, который случайно окажется пусто. Между ними могут быть некоторые тонкие последствия. Рассмотрим следующие примеры.

void Example1()
{
  var collection = new Dictionary<string, string>();
  collection.Add("key1", "value1");
  collection.Add("key2", "value2");
  foreach (var kvp in collection)
  {
    collection = new Dictionary<string, string>();
    Console.WriteLine(kvp);
  }
}

void Example2()
{
  var collection = new Dictionary<string, string>();
  collection.Add("key1", "value1");
  collection.Add("key2", "value2");
  foreach (var kvp in collection)
  {
    collection.Clear();
    Console.WriteLine(kvp);
  }
}

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

Во втором примере коллекция очищается во время перечисления, что приведет к InvalidOperationException , поскольку коллекция была изменен.

5
ответ дан 28 November 2019 в 00:52
поделиться

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

1
ответ дан 28 November 2019 в 00:52
поделиться

Dictionary.clear удалит все элементы из вашего словаря. new Dictionary создает новый объект словаря в памяти, пока ваш предыдущий словарь не используется, чтобы сборщик мусора очистил его позже.

0
ответ дан 28 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: