【问题标题】:List/matrix is not saving the correct values列表/矩阵未保存正确的值
【发布时间】:2010-12-13 12:07:06
【问题描述】:

我收到的作业有一个奇怪的问题。我们应该实现一个矩阵类。好吧,这并不难,但 Python 不会按照我说的去做。但我确信有一个解释。

问题在于,在下面的代码中,我尝试将值(在列表中提供)保存到矩阵中。

class simplematrix:
    matrix = [[]]
    def __init__(self, * args):
       lm = args[0]
       ln = args[1]
       values = args[2]
       self.matrix = [[0]*ln]*lm

       for m in range(lm):
           for n in range(ln):
               self.matrix[m][n] = values[(m*ln)+n]

vals = [0,1,2,3,4,5]
a = simplematrix(2,3,vals)

当我尝试打印矩阵时,我希望在一张纸上得到 [[0,1,2],[3,4,5]],如果我手动运行它就会得到。如果我从 Python 打印矩阵,我会得到 [[3,4,5],[3,4,5]] 。 谁能告诉我为什么 Python 会这样,或者我是否在某个地方犯了一些愚蠢的错误? :)

【问题讨论】:

    标签: python list matrix


    【解决方案1】:

    问题出在[[0]*ln]*lm。结果包含lm对同一列表的引用,因此当您修改一行时,所有行似乎都发生了变化。

    试试:

    self.matrix = [[0]*ln for i in xrange(lm)]
    

    【讨论】:

    • 啊,好吧。非常感谢您的快速回答和解释。我没有看到多次引用同一个列表的用途,所以我自己永远也想不通:)再一次 - 谢谢。
    • 不客气。每个人在某些时候都会被这个抓住。
    【解决方案2】:

    Tim 和 aix 的回答纠正了你的错误,但是这一步甚至不是必需的,你可以使用列表理解在一行中完成整个事情:

    self.matrix = [[values[m*ln+n] for n in range(ln)] for m in range(lm)]
    

    你也可以说:

    vals = range(6)
    

    与您已经拥有的相反。这会整理您的代码并使其更加 Pythonic。

    【讨论】:

    • 哇,这很紧凑,但更好。感谢您的提示。
    • 没问题,这就是 Python 的魅力所在。
    【解决方案3】:

    问题是self.matrix = [[0]*ln]*lm 没有给你一个lm 单独子列表的列表,而是一个lm 对单个相同列表[[0]*ln] 的引用的列表。

    试试

    self.matrix = [[0]*ln for i in range(lm)]
    

    (如果您使用的是 Python 2,请改用 xrange(lm))。

    【讨论】:

    • xrange 和 range 有什么区别?
    • xrange 基本上只在需要时存储列表元素,因此如果您使用具有大型列表结构的数据,则占用的内存要少得多。它实际上有点复杂,因为 xrange 返回的是一个 xrange 对象而不是一个列表,但据您所知,它是为了减少内存使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多