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

Python中.pop方法链式与分步调用的行为差异原因咨询

嘿,这个问题的核心其实是你没注意到dict.pop()方法的返回值特性——两段代码给变量赋值的东西根本不是一个类型!

关键知识点:dict.pop()到底返回什么?

先把这个点掰明白:Python里的dict.pop(key, default)方法做两件事:

  • 从字典里删掉key对应的键值对(如果key存在的话)
  • 返回被删掉的value,要是key不存在就返回你传的default值

现在分别看两段代码的逻辑:

第一段代码:变量存的是字典

# 第一步:拿到目标字典(要么是event.pk对应的字典,要么是空字典)
events_sales_gross_last_7_days = events_sales_gross_last_7_days_incl_today.get(event.pk, {})
# 第二步:调用字典的pop,这个操作只是修改了上面的字典,但变量还是指向原字典
events_sales_gross_last_7_days.pop(timezone.now().date(), 0)
# 第三步:打印的是修改后的字典,自然符合预期
print(events_sales_gross_last_7_days)

这里events_sales_gross_last_7_days从始至终都是字典类型,所以最后输出的是移除了今日日期键后的结果。

第二段代码:变量存的是pop的返回值(整数)

# 链式调用时,get返回字典,紧接着调用pop——此时变量接收的是pop的返回值!
events_sales_gross_last_7_days = events_sales_gross_last_7_days_incl_today.get(event.pk, {}).pop(timezone.now().date(), 0)
print(events_sales_gross_last_7_days)

这里pop返回的要么是字典里今日日期对应的数值(比如你预期的12300),要么是默认的0——不管哪种情况,这个变量现在是整数类型,而不是字典。

你遇到的'int' object has no attribute 'get'错误,肯定是后续代码里试图把这个整数当字典用,调用了get()方法,但整数根本没有这个属性,所以报错了。

想链式调用又要保留字典?这么改

其实分步写已经很清晰了,可读性还高,但如果你非要用类似链式的写法,可以先拷贝字典再操作(避免修改原字典里的内容,看你需求):

# 先拷贝出目标字典,再执行pop操作
temp_dict = events_sales_gross_last_7_days_incl_today.get(event.pk, {}).copy()
temp_dict.pop(timezone.now().date(), 0)
events_sales_gross_last_7_days = temp_dict

内容的提问来源于stack exchange,提问作者Joey Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:16:24