Python 一些我两天都找不到的bug(输出不符合预期)
上面是说明我遇到的问题的代码。 代码打印的内容是: 然而,代码输出: 那么,这种问题有解决办法吗 多谢各位~ 有人提供了以下解决方案: 然而,这并不是解决这类问题的典型方法。这是因为如果我使用的[add]函数或示例中的a、b数组发生更改,此解决方案将失去其效果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
换句话说,此代码提供了所需的输出:
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
只是同一基础对象的两个名称。因此,我们可以使用nameb
修改数组,如果使用namea
,我们也会看到更改,因为它是相同的数组
如果将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)