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
相关产品推荐
相关产品推荐

