【问题标题】:Custom transposing a list messes up original variable in Python自定义转置列表会弄乱 Python 中的原始变量
【发布时间】:2013-08-10 13:41:56
【问题描述】:

我有这个函数应该转置它得到的列表。这行得通,但由于某种原因,它也改变了原始矩阵:为什么?

Matrix = [["1"], ["1","2"], ["1","2","3","4"], []]

def test():
    global Matrix # same happens when global or not
    tMatrix = Matrix
    print(tMatrix) # 1
    tMatrix = transposer(Matrix)
    print(tMatrix) # 2
    print(Matrix) # 3

输出:

[['1'], ['1', '2'], ['1', '2', '3', '4'], []]   # 1
[['1', '1', '1'], ['2', '2'], ['3'], ['4']]     # 2
[[], [], [], []]                                # 3

我觉得应该没关系,但是这里是转置函数:

def transposer(m):
    tm = []
    maxi = 0
    for i in range(0, len(m)):
        maxi = max(maxi, len(m[i]))
    for z in range(0, maxi):
        row = []
        for j in range(0, len(m)): 
            try:
                row.append(m[j].pop(0))
            except:
                pass
        tm.append(row)
    return(tm)

即使没有在该变量上调用函数,矩阵变量怎么可能也会受到影响?

【问题讨论】:

    标签: python-3.x transpose


    【解决方案1】:

    当你这样做时

    tMatrix = Matrix

    实际上,您正在使 tMatrix 成为对原始 Matrix 对象的引用。因此,当您将transposer 函数的输出分配回tMatrix 时,您实际上是在更改原始Matrix 对象本身。当你习惯了 python 时,这是一个非常常见的误解,比如你可以看到here,例如(答案也值得一读)。

    尝试阅读 Python 处理赋值的方式,你会发现与其他语言的区别:

    http://learnpython.pbworks.com/w/page/15956522/Assignment

    http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/variables.html

    编辑:

    要解决这个问题,您可以复制原始对象通过copy operation 传递给transpose

    def transposer(n):
        m = copy.copy(n)
        tm = []
        maxi = 0
        for i in range(0, len(m)):
            maxi = max(maxi, len(m[i]))
            print i, maxi
        for z in range(0, maxi):
            row = []
            for j in range(0, len(m)): 
                try:
                    row.append(m[j].pop(0))
                except:
                    pass
            tm.append(row)
        return(tm)
    

    就像旁注一样,您将元素视为字符串。如果它们应该是数字,您可以在没有" " 的情况下输入它们。此外,如果您不需要使用自己的转置算法,您可以使用 NumPy 包,它已经可以使用 matrix transposition

    【讨论】:

    • 您可能有一个解决方案来代替做什么?我知道它是一个参考,就像我在 C++ 中看到的那样,但是有一个选项可以参考绑定。
    • 问题出在转置函数上。当您执行m[j].pop(0) 时,您将删除原始Matrix 中的元素,该元素通过m 传递。我正在编辑我的答案,所以它是正确的。
    • 我从复制模块中找到了这个“copy.deepcopy”。我不知道它实际上是弹出有这种副作用的!谢谢。
    猜你喜欢
    • 2021-06-27
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多