You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:57