リストを保持する 2 つのプロパティがあります。このリストのアイテムが変更されるたびに、他のリストが更新されるようにしたいと思います。これにはステートメントが含まれますobj.myProp[3]=5
。現在、このステートメントは getter 関数を呼び出してリスト全体を取得し、リストから 3 番目の項目を取得して、それを 5 に設定します。myProp
リストは変更されますが、2 番目のリストは更新されません。
class Grid(object):
def __init__(self,width=0,height=0):
# Make self._rows a multi dimensional array
# with it's size width * height
self._rows=[[None] * height for i in xrange(width)]
# Make `self._columns` a multi dimensional array
# with it's size height * width
self._columns=[[None] * width for i in xrange(height)]
@property
def rows(self):
# Getting the rows of the array
return self._rows
@rows.setter
def rows(self, value):
# When the rows are changed, the columns are updated
self._rows=value
self._columns=self._flip(value)
@property
def columns(self):
# Getting the columns of the array
return self._columns
@columns.setter
def columns(self, value):
# When the columns are changed, the rows are updated
self._columns = value
self._rows = self._flip(value)
@staticmethod
def _flip(args):
# This flips the array
ans=[[None] * len(args) for i in xrange(len(args[0]))]
for x in range(len(args)):
for y in range(len(args[0])):
ans[y][x] = args[x][y]
return ans
実行例:
>>> foo=grid(3,2)
>>> foo.rows
[[None, None], [None, None], [None, None]]
>>> foo.columns
[[None, None, None], [None, None, None]]
>>> foo.rows=[[1,2,3],[10,20,30]]
>>> foo.rows
[[1, 2, 3], [10, 20, 30]]
>>> foo.columns
[[1, 10], [2, 20], [3, 30]]
>>> foo.rows[0][0]=3
>>> foo.rows
[[3, 2, 3], [10, 20, 30]]
>>> foo.columns
[[1, 10], [2, 20], [3, 30]]
最後の 3 行を見ると、ここで実際の問題が発生しています。サブリストの最初の項目を 3 に設定しましたが、foo.columns
自分自身を更新して 3 をリストに入れることはありません。
要するに、サブアイテムが変更されている場合でも、常に別の変数を更新する変数を作成するにはどうすればよいですか?
私はPython 2.7を使用しています