Python deepCopy是否复制从旧词典中删除后留下的空间?
我正在尝试根据从字典中删除键。后者提出的一个解决方案是: 通过复制旧词典创建新词典的步骤Python deepCopy是否复制从旧词典中删除后留下的空间?,python,dictionary,Python,Dictionary,我正在尝试根据从字典中删除键。后者提出的一个解决方案是: 通过复制旧词典创建新词典的步骤 在源代码1中,我做了以下操作: 我创建了一个新字典new\u flights 删除键del flights[键] 最后使用new\u flights=copy.deepcopy(flights) 在源代码2中,我做了以下工作: 我创建了一个新字典new\u flights 复制到新字典new\u flights[key]=flights[key] 最后flights.clear() 两种方法都不起
在源代码1中,我做了以下操作:
- 我创建了一个新字典
new\u flights
- 删除键
del flights[键]
- 最后使用
new\u flights=copy.deepcopy(flights)
- 我创建了一个新字典
new\u flights
- 复制到新字典
new\u flights[key]=flights[key]
- 最后
flights.clear()
源代码1
源代码2
讨论后的源代码 基于这些评论,我做了以下操作,并使用deepcopy删除了引用。看来它起作用了。这是对的吗
def remove_old_departure_dates(flights, search_date):
old_flights = defaultdict(lambda : defaultdict(list))
new_flights = defaultdict(lambda : defaultdict(list))
s_date = datetime.strptime(search_date,'%m/%d/%y')
for key in flights.keys():
dep_date = datetime.strptime(key.DDATE,'%m/%d/%y')
if(s_date > dep_date):
print "removing dates " + key.DDATE +" "+search_date
old_flights[key] = copy.deepcopy(flights[key])
else:
new_flights[key] = copy.deepcopy(flights[key])
return (old_flights, new_flights)
我知道我在问题中提到它作为参考。我实际应用了这个解决方案。但是还是不行。你读了你链接的问题的答案了吗?执行
flights.clear()
会清空字典,但字典不会向下调整大小。现在有了一个非常大的哈希表,其中包含虚拟条目。相反,制作一份副本,并将其重新分配给名称,确保没有对旧词典的引用,以便旧词典被垃圾收集。此外,正如这个问题所指出的,Python进程可能不会将释放的内存返回给操作系统。什么不起作用?你怎么知道的?到底是什么问题?你只是说“两种方法都不起作用”,但这不是一个足够的问题说明。你怎么知道?你用什么来监控你的记忆?你使用什么样的系统?窗户?OSX?Linux?再一次。你需要在问题本身中提供这些细节。如问题中所述,一些操作系统没有“看到”从Python进程中释放内存,即使内存实际上已被释放。x=[1,2,3]
,然后delx
。但这并不意味着如果您在代码中的其他地方执行了y=x
,那么y
将被删除。只要在某个地方有引用,基本列表将继续存在。我知道我在问题中提到它作为引用。我实际应用了这个解决方案。但是还是不行。你读了你链接的问题的答案了吗?执行flights.clear()
会清空字典,但字典不会向下调整大小。现在有了一个非常大的哈希表,其中包含虚拟条目。相反,制作一份副本,并将其重新分配给名称,确保没有对旧词典的引用,以便旧词典被垃圾收集。此外,正如这个问题所指出的,Python进程可能不会将释放的内存返回给操作系统。什么不起作用?你怎么知道的?到底是什么问题?你只是说“两种方法都不起作用”,但这不是一个足够的问题说明。你怎么知道?你用什么来监控你的记忆?你使用什么样的系统?窗户?OSX?Linux?再一次。你需要在问题本身中提供这些细节。如问题中所述,一些操作系统没有“看到”从Python进程中释放内存,即使内存实际上已被释放。x=[1,2,3]
,然后delx
。但这并不意味着如果您在代码中的其他地方执行了y=x
,那么y
将被删除。只要在某个地方有对它的引用,基础列表就会继续存在。
def remove_old_departure_dates(flights, search_date):
new_flights = defaultdict(lambda : defaultdict(list))
s_date = datetime.strptime(search_date,'%m/%d/%y')
for key in flights.keys():
dep_date = datetime.strptime(key.DDATE,'%m/%d/%y')
if(s_date > dep_date):
new_flights[key] = flights[key]
flights.clear()
return new_flights
def remove_old_departure_dates(flights, search_date):
old_flights = defaultdict(lambda : defaultdict(list))
new_flights = defaultdict(lambda : defaultdict(list))
s_date = datetime.strptime(search_date,'%m/%d/%y')
for key in flights.keys():
dep_date = datetime.strptime(key.DDATE,'%m/%d/%y')
if(s_date > dep_date):
print "removing dates " + key.DDATE +" "+search_date
old_flights[key] = copy.deepcopy(flights[key])
else:
new_flights[key] = copy.deepcopy(flights[key])
return (old_flights, new_flights)