获取带x、y坐标的二维列表时遇错误:'generator' object does not support item assignment
解决'generator' object does not support item assignment错误
嘿,我来帮你搞定这个问题!你遇到的这个'generator' object does not support item assignment错误,本质是你把生成器当成了列表来操作,但生成器是不可变的迭代器,压根没法直接修改里面的元素。
先看你可能写错的代码
大概率你是用了圆括号()创建生成器,而不是方括号[]创建列表,比如:
# 错误示例:生成器不能赋值 coords = ((x, y) for x in range(3) for y in range(3)) coords[0] = (2, 2) # 这里直接触发错误
生成器表达式((x,y) for ...)返回的是生成器对象,它的设计是用来迭代取值的,不支持通过索引修改元素这种操作。
正确的解决方法
1. 用列表推导式创建二维列表
直接用方括号[]生成真正的列表,这样就能正常修改元素了:
# 正确写法:生成包含列表的二维结构(方便修改坐标) coords = [[x, y] for x in range(3) for y in range(3)] # 修改第一个元素的x坐标 coords[0][0] = 99 print(coords) # 输出: [[99, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
如果你的需求是生成固定初始值的二维列表,比如全是(0,0),就这么写:
coords = [[0, 0] for _ in range(5)] coords[2][1] = 5 # 修改第三个元素的y坐标
2. 把生成器转成列表(不推荐,除非必要)
如果已经有了生成器对象,也可以先转成列表再操作,但要注意如果生成的是元组(比如(x,y)),元组本身也是不可变的,所以还是得换成列表:
# 先转成列表 gen = ((0, 0) for _ in range(5)) coords = list(gen) # 但元组不能修改,所以得把元组转成列表 coords = [list(item) for item in coords] coords[0][0] = 1 # 现在可以修改了
避坑提醒
别用[[0,0]]*5这种方式初始化二维列表!这会让所有子列表都指向同一个内存对象,修改一个会连累所有:
# 错误示范,踩坑现场 coords = [[0,0]] * 5 coords[0][0] = 1 print(coords) # 输出: [[1,0], [1,0], [1,0], [1,0], [1,0]]
一定要用列表推导式[[0,0] for _ in range(5)]来创建独立的子列表。
内容的提问来源于stack exchange,提问作者Ishaan Kalsi
相关产品推荐
相关产品推荐

