Под «мелким копированием» это означает, что контент словаря не копируется по значению, а просто создается новая ссылка.
>>> a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
Напротив, глубокий копия будет копировать все содержимое по значению.
>>> import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
Итак:
b = a
: присвоение задания, сделать a
и b
указывает на тот же объект , [/g1] b = a.copy()
: Неверное копирование, a
и b
станут двумя изолированными объектами, но их содержимое по-прежнему имеет одну и ту же ссылку [/g2] b = copy.deepcopy(a)
: Глубокое копирование, структура и содержание a
и b
становятся полностью изолированными. [/g3] Вы не указываете дату при создании объекта jj
datetime, поэтому используется дата по умолчанию 1900-01-01. Часовые пояса не являются фиксированными объектами; со временем они меняются, и часовой пояс США / Центрального региона использовал другое смещение еще в 1900 году.
Как минимум, используйте недавнюю дату, например, сегодня , например:
# use today's date, with the time from jj, and a given timezone.
datetime.datetime.combine(datetime.date.today(), jj.time(), tzinfo=tzz)
Если вам нужно только время , тогда не создать datetime
объекты для их хранения; модуль datetime
имеет выделенный объект time()
. Я бы также не использовал strftime()
для создания объектов из литералов. Просто используйте конструктор для передачи целых чисел:
jj = datetime.time(10, 0, 0) # or just .time(10)
Другие хорошие правила: Если вам приходится иметь дело с датами с часовыми поясами, попробуйте переместить их в datetime
объектов в UTC в тот момент, когда ваш код получает или загружает их. Если у вас есть только время дня, но вам все еще нужна поддержка часового пояса, прикрепите их к сегодняшней дате, чтобы вы получили правильный часовой пояс. Снова конвертируйте в строки как можно позже.