我正在编写一个Python程序来玩Tic Tac Toe,使用Numpy数组,其中“{”代表1
,“O”代表0
。该课程包括在棋盘上放置标记的功能:
import numpy as np
class Board():
def __init__(self, grid = np.ones((3,3))*np.nan):
self.grid = grid
def place_mark(self, pos, mark):
self.grid[pos[0],pos[1]] = mark
所以,例如,
board = Board()
board.place_mark([0,1], 1)
print board.grid
产量
[[ nan 1. nan]
[ nan nan nan]
[ nan nan nan]]
我想知道pos[0], pos[1]
函数中的place_mark
参数是否可以某种方式被pos
的'解包'内容替换(它总是长度为2的列表)。在Ruby中,这将使用splat运算符完成:*pos
,但这似乎不是Python中的有效语法。
答案 0 :(得分:3)
使用Numpy,索引与列表和多维索引之间存在差异。 self.grid[[0,1]]
相当于将每个3x1数组self.grid[0]
和self.grid[1]
连接成3x2数组。
如果您使用元组而不是列表进行索引,那么它将被正确解释为多维索引:self.grid[(0, 1)]
被解释为与self.grid[0, 1]
相同。
有一个*
运算符用于解包序列,但仅在函数参数的上下文中,至少在Python 2中。因此,对于列表,您也可以这样做:
def place_mark(self, mark, x, y):
self.grid[x, y] = mark
place_mark(1, *[0, 1])
答案 1 :(得分:2)
正如Lukasz所建议的那样,输入参数应该是一个元组。在此示例中,它可以转换为:
def place_mark(self, pos, mark):
self.grid[tuple(pos)] = mark
我的问题与What is the pythonic way to unpack tuples?不一样,因为pos
不构成函数的输入参数,而是构成二维数组的索引。