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

Python循环中字典赋值疑问:为何直接赋值仅保留最后键值对?

字典赋值导致数据丢失的问题解答

问题描述

我在做UFC运动员数据爬取的小项目时遇到了一个困惑:

  • 使用id[x] = href['href']时,能正常将所有运动员的编号与对应链接存入字典,输入选择的编号可以输出对应链接
  • 但换成id = {x : href['href']}时,字典里只会保留最后一个键值对,无法获取之前的运动员链接

可运行代码如下:

import requests
from bs4 import BeautifulSoup

input2 = str(input('type the name of the athlete: '))

payload = {'gender':'All', 'search':input2}
session = requests.Session()
p = session.get('https://www.ufc.com/athletes/all?', params=payload)

soup2 = BeautifulSoup(p.text, 'html.parser')

spesific_athlete = soup2.find_all('div','c-listing-athlete-flipcard__inner')
id = {}
for x, a in enumerate(spesific_athlete, 1):
    spesific_athlet = a.find('span','c-listing-athlete__name')
    
    href = a.find('a', 'e-button--black')

    #{key : value}
    id[x] = href['href']

    print(spesific_athlet.text, ': ', href['href'], '\n', x) 

choose = int(input('Which athlete do you choose(type a number): '))
print(id[choose])

原因分析

两种写法的核心差异在于是否保留字典原有数据:

  • id[x] = href['href']:这是对已初始化的字典id进行键值对的添加或更新操作。每次循环都会把当前的编号x和对应链接存入字典,之前的键值对会被完整保留,最终字典包含所有循环生成的内容。
  • id = {x : href['href']}:这是每次循环都重新创建一个新字典,直接覆盖掉之前的id变量。循环结束后,字典里自然只存在最后一次循环生成的那一个键值对。

可选修复方案

如果想通过直接构建字典的方式实现需求,可以使用字典推导式一次性生成完整字典,避免循环内反复覆盖的问题:

# 替换原循环内的赋值代码
id = {x: a.find('a', 'e-button--black')['href'] for x, a in enumerate(spesific_athlete, 1)}

这种写法会遍历所有运动员数据,一次性生成包含所有编号与对应链接的字典,效果和原代码一致。

内容的提问来源于stack exchange,提问作者Alp Eren Gül

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:02:40