我在这里遇到了一些问题。请查看我的代码,我不知道代码中的错误。这很简单,但结果令我感到困惑。我附上了以下代码。
import numpy as np
import matplotlib.pyplot as plt
def S(xc):
N=len(xc)
r=0.0
s=0.0
# calculation quartile
for m in range(0,N-1):
for n in range(m+1,N):
if (xc[m] > xc[n]):
q=xc[m]
xc[m]=xc[n]
xc[n]=q
if (N % 4 < 2):
q=(xc[N-N/4-1] + xc[N-N/4])*0.5-(xc[N/4-1]+xc[N/4])*0.5
else:
q=xc[N-N/4-1]-xc[N/4]
#calculation standard deviation
for m in range(0,N):
r+=xc[m]
s+=xc[m]*xc[m]
r=np.sqrt(s/N-(r/N)*(r/N))
#calculation
if (q<r):
s=q
else:
s=r
hasil=0.9*(s/1.34)*pow(N,-0.2)
return hasil
fc=0.3
fm=0.02
mu=1
Nsim=10
bb=[]
for nn in range(0,Nsim):
bb.append((1+(mu*np.cos(2*np.pi*fm*nn)))*np.cos(2*np.pi*fc*nn))
print bb
print S(bb)
print bb
当我删除&#34; S&#34;的功能时代码有效。然而,在主要功能之后,&#34; S&#34;函数,变量数据&#34; bb&#34;即使我只打印相同的变量,也是不同的。我不明白发生了什么。
感谢您的帮助。非常感谢
阿尔文
答案 0 :(得分:1)
致电val source = sc.textFile("Input_file_001.txt")
val fileread = source.filter(x => ! x.startsWith("Dept"))).filter(_.nonEmpty).map(z => z.trim)
会通过S(bb)
等语句更改bb
的内容。
答案 1 :(得分:0)
这是在Python中使用可变类型时的(非)预期行为。在您的情况下,将可变类型bb
(列表)传递给函数S
。
您将bb
传递给S()
,变量名称为xc
,在S中,您已获得xc[m]=xc[n]
行和xc[n]=q
行。这会更改列表xc
,列表bb
指向的列表相同。
更简单的例子:
>>> def funny(some_list):
... for i in range(len(some_list)): # terrible way to iterate over a list
... some_list[i] = some_list[i] * 2 # assigning back to the list
...
>>>
>>> alist = [1, 2, 3]
>>>
>>> funny(alist)
>>> alist
[2, 4, 6]
>>>
调用alist
后, funny()
被更改了,原因是我传入的列表已分配。
如果您不想要这种行为,请将列表副本作为S(bb[:])
传递,或者通过创建S
的副本在xc
内创建新列表。
答案 2 :(得分:0)
bb
是一个列表,列表是可变的。
即使S()
通过不同的名称xc
引用其参数,最终它也引用同一个对象。当S()
执行诸如xc[n]=q
之类的语句时,基础列表对象会被更改。