ここでの目標は、[[1,2],[3,4],[7,1]]
のような座標のリストを取って、これらの座標をすべて印刷する場合のキャンバスの大きさを計算することです。最大の左下座標と、これらの点にキャンバスがぴったり合う最小の右上座標を取ってください。たとえば、上記のリストでは、[[1,1],[7,4]]
を探しています。これは、すべてのポイントが収まる最小の矩形を定義しています。Python:短い座標関数が入ってくる引数の値を予期せず変更する
この関数の途中で、受信した "ボード"に新しい値が割り当てられています。ループの着信board
の座標を移動するとき
def print_board(board):
# import pdb; pdb.set_trace()
dimensions = None
for i in board:
if dimensions == None:
dimensions = [i, i]
else:
dimensions[0][0] = min(dimensions[0][0], i[0])
#'board' is redefined !!!
dimensions[0][1] = min(dimensions[0][1], i[1])
#dimensions[1][0] = max(dimensions[1][0], i[0])
#dimensions[1][1] = max(dimensions[1][1], i[1])
# (after we get the canvas size
# we print the canvas with the points on it
# but we never make it that far without an error)
は、それが一度に見ている座標何にboard[0]
を設定しているようです。したがって、[[1,2],[3,4],[7,1]]
は、最初に[[3,4],[3,4],[7,1]]
に、次に[[7,1],[3,4],[7,1]]
に変更されます。
board
はまったく変更されません。そのポイントのコピーをしていない - あなたがあなたのボードの最初の点にdimensions
で両方の項目を設定している
dimensions = [i, i]
を行う
(Pythonの3.2.2)
私はそれが疑念を抱いていた、という言葉を引用しないで、値渡し/参照渡しの問題です。 for文でイテレータの現在の状態のコピーを作成する方法はありますか? どうすればいいですか? dimension = list(str([i、i]))(ちょっと、あれがあれば...) – Brownbat
@Brownbat 'dimensions = [i [ 、i [:]] 'は動作します。 '[:]'はリストのコピーを作成します。しかし、私は前にではなく、minsとmaxsを見つけたので、 'dimensions'を構築することをお勧めします。これはPythonであり、C言語ではありません。 – agf
あなたのご協力ありがとうございます。あなたはそれがforループではないと言っていると思いますが、コピーを難しくするリストがあります。何らかの理由で、 'mylist = [2,3]; i = mylist [0];私はmylistを変えていないようだ... mylist:i; x = i; x = 3'はmylistを3に設定していない。理解していますが、フィードバックの公平な分担以上のものを与えているので、ここでロールして中間値を使用してください。 – Brownbat