Python 一些我两天都找不到的bug(输出不符合预期)

Python 一些我两天都找不到的bug(输出不符合预期),python,numpy,storage,multidimensional-array,Python,Numpy,Storage,Multidimensional Array,上面是说明我遇到的问题的代码。 代码打印的内容是: 然而,代码输出: 那么,这种问题有解决办法吗 多谢各位~ 有人提供了以下解决方案: 然而,这并不是解决这类问题的典型方法。这是因为如果我使用的[add]函数或示例中的a、b数组发生更改,此解决方案将失去其效果 换句话说,此代码提供了所需的输出: from numpy import* import time import pylab as plt dx=dy=0.1 x,y = mgrid[:1:dx,:1:dy] data=[] for i

上面是说明我遇到的问题的代码。 代码打印的内容是:

然而,代码输出:

那么,这种问题有解决办法吗

多谢各位~

有人提供了以下解决方案:

然而,这并不是解决这类问题的典型方法。这是因为如果我使用的[add]函数或示例中的a、b数组发生更改,此解决方案将失去其效果


换句话说,此代码提供了所需的输出:

from numpy import*
import time
import pylab as plt

dx=dy=0.1
x,y = mgrid[:1:dx,:1:dy]

data=[]
for i in range(4):
    a=zeros([10,10])
    b=ones([10,10])
    a[1:-1,1:-1] = b[1:-1,1:-1]*i
    data.append(a)

for k in range(4):
     print(data[k])
但这并不是:

for _ in range(4):
    print(a)
    add(a, b)
让我们先看一个简单的例子,它将帮助您了解发生了什么:

data = []
for _ in range(4):
    data.append(a)
    add(a, b)

for d in data: 
    print(d)
你看到发生了什么?我们使数组
b
与数组
a
相同,然后修改数组
b
也会更改数组
a

这是因为实际上只有一个数组对象!“变量”
a
b
只是同一基础对象的两个名称。因此,我们可以使用name
b
修改数组,如果使用name
a
,我们也会看到更改,因为它是相同的数组

如果将
a
附加到列表中,也会发生同样的情况。该列表包含对对象的引用。但在您的情况下,所有引用都指向同一个对象

解决此问题的一种方法是,每次将数组附加到列表时都创建一个新的数组对象:

In [184]: a = zeros(3)

In [185]: a
Out[185]: array([ 0.,  0.,  0.])

In [186]: b = a

In [187]: b[0] = 99

In [188]: print(a)
[ 99.   0.   0.]

不清楚你在问什么。我没有得到您用这两个代码片段替换[[0.4.4……]]的第二个输出。您的代码的期望输出是什么?您的第一个代码在我的系统上完全按照您的期望工作。你确定你正在运行与你发布的代码相同的代码吗?谢谢你们,问题已经解决了。下面的答案是一个很好的解决方案。:)谢谢你的详细解答,它确实有帮助~还有Python中的“引用”概念和C++一样,还有很多要学习的~
for _ in range(4):
    print(a)
    add(a, b)
data = []
for _ in range(4):
    data.append(a)
    add(a, b)

for d in data: 
    print(d)
In [184]: a = zeros(3)

In [185]: a
Out[185]: array([ 0.,  0.,  0.])

In [186]: b = a

In [187]: b[0] = 99

In [188]: print(a)
[ 99.   0.   0.]
data = []
for _ in range(4):
    data.append(a.copy())
    add(a, b)