Python Can';t更新嵌套列表中的值

Python Can';t更新嵌套列表中的值,python,Python,我正在为一个班级项目写一个井字游戏。基本上,我有以下清单: grid = [[1,2,3],[4,5,6],[7,8,9]] 我只想根据玩家的不同,用X或O来更新列表值。我试图通过以下函数实现这一点,其中p是用户输入的整数(是的,我确保输入实际上是整数而不是字符串): 当我运行这段代码时,我得到一个错误,说列表索引必须是整数,而不是列表类型。或者,我尝试简单地用此行替换变量c,而不是grid[r][c]=plyr[turn] c = plyr[turn] 打印c的值和类型显示c为int,并匹

我正在为一个班级项目写一个井字游戏。基本上,我有以下清单:

grid = [[1,2,3],[4,5,6],[7,8,9]]
我只想根据玩家的不同,用X或O来更新列表值。我试图通过以下函数实现这一点,其中p是用户输入的整数(是的,我确保输入实际上是整数而不是字符串):


当我运行这段代码时,我得到一个错误,说列表索引必须是整数,而不是列表类型。或者,我尝试简单地用此行替换变量c,而不是
grid[r][c]=plyr[turn]

c = plyr[turn]
打印c的值和类型显示c为int,并匹配用户输入的值。所以我可以找到变量,并且类型匹配,我只是不能更新原始列表中的值。我是否错误地使用了全局变量?我不明白为什么它不会更新。以下是到目前为止的整个计划:

grid = [[1,2,3],[4,5,6],[7,8,9]]
plyr = ("X","O")
turn = 0

def drw_brd():
    i = 1
    f = turn
    for spc in grid:
        print " " + str(spc[0]) + " | " + str(spc[1]) + " | " + str(spc[2]) + " "
        if i<=2:
            print "-----------"
            i+=1

    print''
    print "Player %s (%s's) it's your turn!" %(str(f+1),plyr[turn])
    place = input('Cell number to take:')
    place_sym(int(place))
    check_win()

#def san_in(x):
#    if x not in range(1,9):
#        print "Please enter a number 1 through 9."

def check_win():
    switch_plyr()

def switch_plyr():
    global turn

    """
    if turn == 0:
        turn = 1
    else:
        turn = 0
    """
    if turn <= 0:
        turn = 1
    elif turn >= 1: 
        turn = 0

    #print turn
    drw_brd()

def place_sym(p):
    global turn
    global grid
    global plyr

    for r in grid:
        for c in r:
            if c == p:
                c = plyr[turn]
grid=[[1,2,3]、[4,5,6]、[7,8,9]]
plyr=(“X”,“O”)
转动=0
def drw_brd():
i=1
f=转
对于电网中的spc:
打印“+str(spc[0])+”|“+str(spc[1])+”|“+str(spc[2])+”

如果循环
r
c
中的i是行和列,而不是它们的索引。您需要跟踪索引以更新值。您可以使用


grid[r][c]=plyr[turn]
=>
r[c]=plyr[turn]
in
for c
=>
for c,uu>in enumerate(r)
,bar:不需要嵌套循环我刚刚尝试了一下,但我得到了这个错误:列表分配索引超出范围哦,对不起,我会尝试你的编辑我对我的代码不是100%确定,你可以在循环时打印变量以查看它们的类型和比较的内容。所以
place\u sym
会创建一条“垂直”线,对吗?在这种情况下,只有外循环:
r[p]=plyr[turn]
p
是一个整数而
column
是一个列表时,
column
怎么能等于
p
?这一无所获。@Jean-Françoisfab
是一个整数,
网格
是一个由3个子数组组成的数组,第一个循环通过分配给变量
的每个子数组,第二个循环遍历该行中的每个整数,将该整数分配给变量
,并检查它是否与玩家的输入匹配。好的,明白了。但是,当您可以使用一个赋值来设置值时,您正在使用双循环来设置一个值。此外,OP表示
p
介于1和9之间。这是行不通的。句号。@Jean-Françoisfare当然有效,
p
在1到9之间,列
可以是1到9之间的整数(网格中的原始值),字符串
'X'
或字符串
'O'
,这取决于之前所做的移动。好的,我的错了。我现在明白了,它使用的是值而不是索引。好啊你能修改一下吗?这样我就可以收回我的否决票了?
grid = [[1,2,3],[4,5,6],[7,8,9]]
plyr = ("X","O")
turn = 0

def drw_brd():
    i = 1
    f = turn
    for spc in grid:
        print " " + str(spc[0]) + " | " + str(spc[1]) + " | " + str(spc[2]) + " "
        if i<=2:
            print "-----------"
            i+=1

    print''
    print "Player %s (%s's) it's your turn!" %(str(f+1),plyr[turn])
    place = input('Cell number to take:')
    place_sym(int(place))
    check_win()

#def san_in(x):
#    if x not in range(1,9):
#        print "Please enter a number 1 through 9."

def check_win():
    switch_plyr()

def switch_plyr():
    global turn

    """
    if turn == 0:
        turn = 1
    else:
        turn = 0
    """
    if turn <= 0:
        turn = 1
    elif turn >= 1: 
        turn = 0

    #print turn
    drw_brd()

def place_sym(p):
    global turn
    global grid
    global plyr

    for r in grid:
        for c in r:
            if c == p:
                c = plyr[turn]
def place_sym(p):
    global turn
    global grid
    global plyr

    # row_index will be 0, 1 or 2 (the position in grid).
    # row is an array of 3 integers.
    for row_index, row in enumerate(grid):
        # column_index will be 0, 1, 2 (the position in the row)
        # column_value is the actual integer value to check against
        for column_index, column_value in enumerate(row):
            if column_value == p:
                grid[row_index][column_index] = plyr[turn]