2017-08-22 2 views
1

私はここにいくつか問題があります。私のコードを見てください。私はコードの何が間違っているのか分かりません。それは簡単ですが、結果は私を混乱させています。私は以下のコードを添付しました。いくつかの関数を使用した結果、Pythonの結果と混乱しました

コードは、私はちょうどメイン機能で「S」の機能を削除しながら、しかし、「S」関数の後、変数「BB」上のデータは、私はちょうど同じことを印刷していても異なっていた作品
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 

変数。私は何が起こったのか分からない。

ご協力いただきありがとうございます。おかげでたくさんの

アルビン

+0

この関数では、 'xc [n] = q' ...のように配列に値を代入した後、なぜ驚いたのですか? – alfasin

答えて

1

呼び出すS(bb)xc[m]=xc[n]のようなステートメントをbbの内容を変更します。

0

の変更可能なタイプをPythonで使用すると、これは(予想されない)動作です。あなたの場合は、変更可能なタイプbb(リスト)を関数Sに渡してください。

あなたは変数名xcS()bbを通過させ、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[:])として渡すか、xcのコピーを作成してSの内部に新しいリストを作成します。

0

bbはリストであり、リストは変更可能です。

S()が異なる名前の引数を参照しても、xcは最終的に同じオブジェクトを参照します。 S()xc[n]=qのようなステートメントを実行すると、下位のリストオブジェクトが変更されます。

関連する問題