【问题标题】:Why does the Pycharm debugger and the python running program give two different results after append?为什么Pycharm调试器和python运行程序append后会给出两个不同的结果?
【发布时间】:2016-07-02 21:18:10
【问题描述】:

我不明白。对于相同的情况,调试控制台和运行程序可以返回不同的结果吗?怎么样?

    arrRegion_masks = []
    test = []
    for image_stack in videoData:
        for i in xrange(numROIs):
            roi = self.vb.rois[i]
            arrRegion_mask   = roi.getROIMask(image_stack,self.vb.img, axes=(0,1)) ## BREAKPOINT HERE
            arrRegion_masks = arrRegion_masks.append(arrRegion_mask)

我在调用时有一个断点来检索掩码。 ArrRegion_mask 被返回,它只是一个 2D numpy 数组,如下所示:

>>> arrRegion_mask
array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]])

然后,如果我越过下一行将其附加到arrRegion_masks,它将变为None,然后导致

  File "/home/cornelis/PycharmProjects/BMDanalyse/BMDanalyse/BMDanalyse.py", line 343, in getBMD
    arrRegion_masks = arrRegion_masks.append(arrRegion_mask)
AttributeError: 'NoneType' object has no attribute 'append'

不处于调试模式时我也会得到这个。

为什么这特别令人困惑?因为当我在断点和调试器中时,我可以调出 python 提示符并执行以下操作并得到我期望的结果

>>> test = test.append(arrRegion_mask)
>>> test
[array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]])]

那么调试器和我的运行代码会针对相同的情况给出不同的结果吗?这对我来说非常令人不安,因为这意味着我不能理解一些非常基本的东西,因为我一直认为这不应该。请帮我解释一下。

【问题讨论】:

    标签: python debugging numpy append pycharm


    【解决方案1】:

    append 是一个就地操作(并返回None)。你不需要重新分配。第一次做

    arrRegion_masks = arrRegion_masks.append(arrRegion_mask)
    

    arrRegion_masks 获取附加的新值,但随后append 返回None 并将其分配给arrRegion_masks。所以现在arrRegion_masksNone 并且下一次通过循环你尝试再次使用append (导致你的错误)

    做事

    arrRegion_masks.append(arrRegion_mask)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2012-09-27
      • 1970-01-01
      • 2020-10-15
      • 2018-05-02
      • 1970-01-01
      相关资源
      最近更新 更多