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

编写康威生命游戏时相同逻辑其他位置正常某行报TypeError是什么原因?

错误根因

你对坐标变量的赋值逻辑完全错误,直接导致了类型报错:

  • 外层循环for i in origin中,i是origin的每一行列表本身,不是行号(x坐标),你将i直接赋值给x后,x为列表类型,执行x-1运算时自然会触发「列表与整数不能做减法」的TypeError
  • 内层循环for j in i中,j是行内存储的单元格值(0或1),不是列号(y坐标),赋值给y也完全不符合坐标计算的预期

其他逻辑问题

  1. c = origin属于浅拷贝,修改c时会同步改动原矩阵origin,而生命游戏的迭代需要基于上一帧的完整状态计算,不能直接修改原状态,应该新建矩阵存储新一帧的状态,或对origin做深拷贝后再赋值给c
  2. 右上角判断逻辑错误:elif x == c[-1][-1]完全不符合坐标规则,右上角的x坐标应为0,y坐标应为len(c[0])-1
  3. 邻居统计代码存在笔误:if c[x+1][y] == y应改为if c[x+1][y] == 1
  4. 代码缩进混乱,elif y == 0无对应的外层if,整体循环结构不完整
  5. 缺少越界判断,计算边缘单元格的邻居时容易触发索引越界报错

修复参考

首先调整坐标获取逻辑,用enumerate同时获取索引和值:

while current_cycle < (x_cycle + 1):
    # 新建空矩阵存储新一帧状态
    new_c = [[0 for _ in range(len(c[0]))] for _ in range(len(c))]
    # 遍历行,x为行号,row为当前行数据
    for x, row in enumerate(c):
        # 遍历列,y为列号,cell为当前单元格值
        for y, cell in enumerate(row):
            count = 0
            # 定义8个邻居的方向偏移量,简化分支判断
            directions = [(-1,-1), (-1,0), (-1,1),
                          (0,-1),          (0,1),
                          (1,-1),  (1,0), (1,1)]
            for dx, dy in directions:
                nx = x + dx
                ny = y + dy
                # 坐标合法再统计
                if 0 <= nx < len(c) and 0 <= ny < len(c[0]):
                    if c[nx][ny] == 1:
                        count += 1
            # 后续按生命游戏规则更新new_c[x][y]即可
            if cell == 1:
                new_c[x][y] = 1 if count in (2,3) else 0
            else:
                new_c[x][y] = 1 if count == 3 else 0
    # 替换为新一帧状态
    c = new_c
    current_cycle += 1

内容的提问来源于stack exchange,提问作者Mr-Nightmare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:54:04