使用某些函数

时间:2017-08-22 00:24:14

标签: python

我在这里遇到了一些问题。请查看我的代码,我不知道代码中的错误。这很简单,但结果令我感到困惑。我附上了以下代码。

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;即使我只打印相同的变量,也是不同的。我不明白发生了什么。

感谢您的帮助。非常感谢

阿尔文

3 个答案:

答案 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之类的语句时,基础列表对象会被更改。