Python循环中keys为元组无法赋值,类型显示矛盾求助
问题解答:tuple对象不支持元素赋值的困惑
代码片段
for keys in self.keys: if has_classes := self.class_checker(keys[0]): print(type(keys[0])) # just for demonstrating that it is actual list keys[0] = [x for x in keys[0] if 'class="' not in x] for classes in has_classes: keys[0].append(f'class="{classes}"')
错误信息
<class 'list'> Traceback (most recent call last): File "C:\Users\USER\OneDrive\Desktop\XPATH\base\main.py", line 300, in <module> XPanther('<h1 class="Uo8X3b OhScic zsYMMe">Lidhjet e qasshmërisë</h1>', 'C:\Users\USER\OneDrive\Desktop\XPATH\xpath_test_case.txt').capture() File "C:\Users\USER\OneDrive\Desktop\XPATH\base\main.py", line 100, in capture keys[0] = [x for x in keys[0] if 'class="' not in x] ~~~~^^^ TypeError: 'tuple' object does not support item assignment
原因分析
错误核心不是keys[0]的类型,而是keys本身是元组。元组是Python的不可变类型,无法修改元组内的元素(比如给keys[0]重新赋值)。虽然keys[0]是可变的列表,但你此处的操作是替换元组的第一个元素,而非修改列表内部内容,这触发了元组不可变的限制。
解决办法
有两种可行的处理方式:
方式1:修改列表本身而非替换元组元素
无需给keys[0]重新赋值,直接操作原列表内容:
for keys in self.keys: if has_classes := self.class_checker(keys[0]): # 过滤内容后直接修改原列表 filtered_items = [x for x in keys[0] if 'class="' not in x] keys[0].clear() keys[0].extend(filtered_items) for classes in has_classes: keys[0].append(f'class="{classes}"')
方式2:将元组转为列表后修改
如果必须替换元素,先把元组转为可变列表,修改后再替换回原集合(需确保self.keys支持修改):
# 遍历索引以修改原集合中的元素 for idx, keys in enumerate(self.keys): if has_classes := self.class_checker(keys[0]): # 元组转列表 key_list = list(keys) key_list[0] = [x for x in key_list[0] if 'class="' not in x] for classes in has_classes: key_list[0].append(f'class="{classes}"') # 修改后的列表转回元组,替换原元素 self.keys[idx] = tuple(key_list)
内容的提问来源于stack exchange,提问作者RifloSnake
相关产品推荐
相关产品推荐

