Python:短坐标函数意外地更改传入的参数值

时间:2012-03-22 07:44:12

标签: python reference arguments

这里的目标是获取一些坐标列表,例如[[1,2],[3,4],[7,1]],然后确定如果要打印所有这些坐标,画布应该有多大。取最大左下角坐标和最小右上角坐标,使画布紧贴这些点。例如,在上面的列表中,我们正在寻找[[1,1],[7,4]],它定义了所有这些点都适合的最小矩形。

在这个功能的中间,我看到传入的“板”分配了一个新值。

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)

当for循环移过传入board中的坐标时,它似乎将board[0]设置为当时正在查看的任何坐标。因此,[[1,2],[3,4],[7,1]]将首先更改为[[3,4],[3,4],[7,1]],然后更改为[[7,1],[3,4],[7,1]]

我不希望board完全改变。

(Python 3.2.2)

2 个答案:

答案 0 :(得分:3)

当你这样做时

dimensions = [i, i]

您将dimensions中的两个项目都设置为您的主板中的第一个点 - 而不是复制该点。

然后当你做

        dimensions[0][0] = min(dimensions[0][0], i[0])
        dimensions[0][1] = min(dimensions[0][1], i[1]) 

你正在更新同一点 - 你的董事会的第一点 - 到min函数的结果。

尝试这样的事情,而不是:

def print_board(board):
    xs, ys = zip(*board) # separate out the x and y coordinates
    min_x, max_x = min(xs), max(xs) # find the mins and maxs
    min_y, max_y = min(ys), max(ys)
    dimensions = [[min_x, min_y], [max_x, max_y]] # make the dimensions array

答案 1 :(得分:0)

作为agfs答案的扩展,您可以使用numpy来获得更高效和简洁的代码:

import numpy as np
def print_board(board):
    a = np.array(board)
    return [a.min(axis=0).tolist(), a.max(axis=0).tolist()]

如果您的主板已经是一个numpy数组,并且让该函数返回一个numpy数组的元组,它会缩短甚至更多:

def print_board(board):
    return board.min(axis=0), board.max(axis=0)