Python 如果迭代,DFT会给出不同的结果

Python 如果迭代,DFT会给出不同的结果,python,math,dft,Python,Math,Dft,我创建了一个简单的积分函数和DFT函数,可以与我编写的其他代码一起使用 from math import sin,pi from time import time def aintegral(d,step): return sum(d)*step def partialdft(d,step,w): i = 0 x = d while i/step < len(d): x[int(i/step)]*=sin(w*pi*i) i

我创建了一个简单的积分函数和DFT函数,可以与我编写的其他代码一起使用

from math import sin,pi
from time import time
def aintegral(d,step):
    return sum(d)*step

def partialdft(d,step,w):
    i = 0
    x = d
    while i/step < len(d):
        x[int(i/step)]*=sin(w*pi*i)
        i+=step
    return aintegral(x,step)


x = []
y = 0
while y<100:
    x.append(5*sin(4*pi*y))
    y+=.01

print partialdft(x,.01,4)
从数学导入sin,pi
从时间导入时间
def aintegral(d,步骤):
返回和(d)*步骤
def partialdft(d,步骤,w):
i=0
x=d
当i/step而y
partialdft
函数修改
x
。在第一个循环之后是
x

>>> x[0:10]
[0.0, 0.62666616782152129, 1.243449435824274, 1.8406227634233896, 2.4087683705085765, 2.9389262614623659, 3.4227355296434436, 3.852566213878946, 4.2216396275100756, 4.5241352623300983]
调用函数后,下面是
x

>>> partialdft(x, 0.01, y)
0.051462873158853464
>>> x[0:10]
[0.0, -2.8072359998573911e-13, 1.114040042207106e-12, -2.4744131119314365e-12, 4.316161702819329e-12, -6.5865746141630883e-12, 9.202604511389696e-12, -1.2082375495190468e-11, 1.5129125329320302e-11, -8.1617793532956823e-23]
要避免覆盖
x
,请复制:

def partialdft(d,step,w):
    i = 0
    x = d[:]
    #...

partialdft
函数修改
x
。在第一个循环之后是
x

>>> x[0:10]
[0.0, 0.62666616782152129, 1.243449435824274, 1.8406227634233896, 2.4087683705085765, 2.9389262614623659, 3.4227355296434436, 3.852566213878946, 4.2216396275100756, 4.5241352623300983]
调用函数后,下面是
x

>>> partialdft(x, 0.01, y)
0.051462873158853464
>>> x[0:10]
[0.0, -2.8072359998573911e-13, 1.114040042207106e-12, -2.4744131119314365e-12, 4.316161702819329e-12, -6.5865746141630883e-12, 9.202604511389696e-12, -1.2082375495190468e-11, 1.5129125329320302e-11, -8.1617793532956823e-23]
要避免覆盖
x
,请复制:

def partialdft(d,step,w):
    i = 0
    x = d[:]
    #...

然而,d不是一个局部变量吗?@user1133383,
d
指的是一个列表——与您传递给
partialdft
的列表相同。它是可变的,所以当你在函数中改变它时,你在任何地方都会改变它。如果您不想在任何地方都进行更改,则必须制作某种类型的副本。要进一步扩展上述内容,
d
是一个局部变量,但这仅意味着当您为
d
指定一个新值时,即,当您使
d
引用新对象时,它不会影响名为
d
的任何其他变量。但是,如果程序中其他地方的另一个变量引用了
d
所引用的同一个对象,那么对该对象的更改将在这两个地方产生影响。但是,d不是一个局部变量吗?@user1133383,
d
引用了一个列表——与您传递给
partialdft
的列表相同。它是可变的,所以当你在函数中改变它时,你在任何地方都会改变它。如果您不想在任何地方都进行更改,则必须制作某种类型的副本。要进一步扩展上述内容,
d
是一个局部变量,但这仅意味着当您为
d
指定一个新值时,即,当您使
d
引用新对象时,它不会影响名为
d
的任何其他变量。但是,如果程序中其他地方的另一个变量引用了
d
所引用的同一个对象,那么对该对象的更改将在这两个地方产生影响。