Python使用extend更新列表时重复最后值的问题求助
问题:添加虚拟事件时日期全部变为循环最后一个值
目标是整理数据,使指定日期范围内的每一天至少有一个事件。但使用extend方法向events列表添加gcal_dummy数据时,所有添加的虚拟事件的start日期都变成了循环的最后一个值(2024-04-20),而非循环内设置的对应日期。
相关代码
import os.path os.system('cls' if os.name == 'nt' else 'clear') import datetime pstart=datetime.date(2024, 3, 31) pfinis=datetime.date(2024, 4, 20) events=[ { 'summary' : 'Real Event1', 'creator' : {'email': None, 'self': None}, 'organizer' : {'email': None, 'self': None}, 'start' : {'dateTime': "2024-03-31"}, 'end' : {'date': None}, } , { 'summary': 'Real Event2', 'creator': {'email': None, 'self': None}, 'organizer': {'email': None, 'self': None}, 'start': {'dateTime': "2024-04-05"}, 'end': {'date': None}, } ] gcal_dummy=[ { 'summary' : 'DUMMYDATA', 'creator' : {'email': None, 'self': None}, 'organizer' : {'email': None, 'self': None}, 'start' : {'dateTime': "1960-01-01"}, 'end' : {'date': None}, }] #massage the list by adding a day within the #first add the whole range with dummy dates diff=pfinis-pstart diff=diff.days dummy=pstart for i in range(diff): dummy += datetime.timedelta(days=1) print("dummy=",dummy) events.extend(gcal_dummy) events[-1]["start"]["date"]=dummy print("*****") print("----------") #why is the last value which is 2024apr20 being repeated within all the extends? x=-1 for event in events: x=x+1 print(x,"MAS:", event['start'],event['summary'])
循环内输出示例
15 {'summary': 'DUMMYDATA', 'creator': {'email': None, 'self': None}, 'organizer': {'email': None, 'self': None}, 'start': {'dateTime': '1960-01-01', 'date': datetime.date(2024, 4, 16)}, 'end': {'date': None}} dummy= 2024-04-17
最终输出示例
13 MAS: {'dateTime': '1960-01-01', 'date': datetime.date(2024, 4, 20)} DUMMYDATA 14 MAS: {'dateTime': '1960-01-01', 'date': datetime.date(2024, 4, 20)} DUMMYDATA 15 MAS: {'dateTime': '1960-01-01', 'date': datetime.date(2024, 4, 20)} DUMMYDATA 16 MAS: {'dateTime': '1960-01-01', 'date': datetime.date(2024, 4, 20)} DUMMYDATA
原因分析
问题核心是引用传递:gcal_dummy列表里只有一个字典对象,每次调用events.extend(gcal_dummy)都是把同一个字典的引用添加到events中。所有"虚拟事件"本质上指向同一个字典,最后一次循环修改date值时,会覆盖所有引用该字典的条目,导致所有虚拟事件的日期都是循环最后一次设置的2024-04-20。
解决方法
方法1:使用深拷贝创建新字典
因为字典包含嵌套的子字典(start字段),需要用深拷贝来生成完全独立的新对象,避免引用共享。
修改后的关键代码:
import copy # 新增导入copy模块 # ... 其他代码不变 ... diff=pfinis-pstart diff=diff.days dummy=pstart for i in range(diff): dummy += datetime.timedelta(days=1) print("dummy=",dummy) # 对gcal_dummy中的字典进行深拷贝 new_dummy_event = copy.deepcopy(gcal_dummy[0]) new_dummy_event["start"]["date"] = dummy events.append(new_dummy_event) # 用append添加单个新事件 print("*****")
方法2:直接在循环中构建新事件字典
跳过预先定义的gcal_dummy,每次循环直接创建全新的事件字典,更直观且避免引用问题:
修改后的关键代码:
diff=pfinis-pstart diff=diff.days dummy=pstart for i in range(diff): dummy += datetime.timedelta(days=1) print("dummy=",dummy) # 直接创建新的虚拟事件字典 new_event = { 'summary': 'DUMMYDATA', 'creator': {'email': None, 'self': None}, 'organizer': {'email': None, 'self': None}, 'start': {'dateTime': "1960-01-01", 'date': dummy}, 'end': {'date': None}, } events.append(new_event) print("*****")
两种方法都能让每个虚拟事件成为独立的字典对象,修改日期时不会互相影响,最终每个虚拟事件的start.date会对应循环中的日期值。
内容的提问来源于stack exchange,提问作者user23991531
相关产品推荐
相关产品推荐

