[抱歉,我是 Python 新手。虽然这似乎是一个非常基本的问题,但在询问听众之前,我做了尽职调查,试图避免真正愚蠢的问题]。
我试图找出从函数返回左值的正确习惯用法。假设我有一个包含 64 个对象的容器,并且我希望能够返回对这些对象的引用。
class ChessBoard:
def __init__(self):
self.squares = [None for x in range(64)]
square( row, col ):
return self.squares(row*8+col) <---- I'd like this to be l-value
然后,在课外我想:
board = ChessBoard()
board.square(0,0) = Piece( Shapes.ROOK, Colors.White ) <-- I'm getting an error here
board.square(0,1) = Piece( Shapes.BISHOP, Colors.White )
... etc.
所以,我希望函数“at”返回一个左值(类似于 C++ 中的引用),但我在该语言中找不到任何类似于引用或指针的内容。如果我存储了一个list在每个包含一块的方块中,我可能可以这样做: board.square(0,0)[0] = Piece - 但这看起来很疯狂(或者也许不是 - 正如我所说,我是这门语言的新手)。
您将如何处理这个数据结构?
在Python中,一切是一个参考。唯一的问题是None
is 不可变的,因此您不能使用返回的引用来更改值。
您也不能覆盖赋值运算符,因此您不会得到这种特殊的行为。然而,一个好的且非常灵活的解决方案是覆盖__setitem__ http://docs.python.org/reference/datamodel.html#object.__setitem__ and __getitem__ http://docs.python.org/reference/datamodel.html#object.__getitem__实现订阅运算符的方法([]
)对于班级:
class ChessBoard(object):
def __init__(self):
self.squares = [None] * 64
def __setitem__(self, key, value):
row, col = key
self.squares[row*8 + col] = value
def __getitem__(self, key):
row, col = key
return self.squares[row*8 + col]
Usage:
>>> c = ChessBoard()
>>> c[1,2] = 5
>>> c[1,2]
5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)