質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

662閲覧

自作関数内の処理が引数側にも適用されてしまう

shibainu85

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2020/03/17 03:10

前提・実現したいこと

python初心者です
こちらのサイトを参考に心拍を検出する関数を作っていたのですが問題が発生したため、質問をさせていただきます。

発生している問題・エラーメッセージ

以下の関数を用いた場合に、
もとのプログラム内の第2引数として用いた配列に対しても関数内で行った処理が適用されてしまいます。
関数内で一度別の変数に受け渡しを行ってみたのですが改善されず、困っております。

該当のソースコード

python

1def peaks(sec, res): # 時間配列.ECG配列 2 res2=res 3 f = sec[1]-sec[0] 4 pwidth = 0.5 / f 5 thres = max(res) * 0.7 6 length = len(res) 7 res2[res2 < thres] = thres 8 9 dif = res2[1:length-1]-res2[0:length-2] 10 ddif = dif[1:(length-2)]*dif[0:(length-3)] 11 ppos = np.array([0]) 12 while 1: 13 p = np.argmin(ddif) 14 if ddif[p] == 0: 15 break 16 if len(ppos) > 0: 17 q = abs(ppos-p) 18 if min(q) > pwidth: 19 ppos = np.append(ppos, p) 20 else: 21 ppos = np.append(ppos, p) 22 ddif[p] = 0 23 ppos = ppos[1:] 24 ppos += 1 25 return np.sort(ppos)
DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

リストのコピーでハマった話 - Qiita

ここらへんが参考になるかと。
クラス変数(リストも含めて)なんかは、引数に渡すとアドレスが渡される形となるため、関数内でナカミを操作すると渡し元の方も変更されてしまいます

投稿2020/03/17 03:41

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shibainu85

2020/03/17 06:40

リストのコピーの仕様は初耳でした。 知っていれば簡単なことだったんですね、ありがとうございました!
LouiS0616

2020/03/17 11:19

@y_waiwai さん なんとなく言いたいことは分かります。 ただ『クラス変数』という単語はPythonでは全く別の意味を持っているので、この場合は不適です。 そもそもPythonは全てがオブジェクトなので、Javaの 値型/参照型 みたく呼び分けることはありません。
guest

0

単にres2=resとしてもres2res同じ配列を指すようになるだけで新しい配列が作られるわけではありません。

処理内容をちゃんと見ていないので確実なことは言えませんが、

■ 配列の中の値を変更して計算するのが効率がよかったりわかりやすいのであれば、配列をコピーして使うのがいいと思います。
そのとき、配列の複雑さによっては、深い(deep)コピーをする必要があるかもしれません。

■ 配列の中身を変更しなくて済む方法があるのであれば、たぶん、そのほうが効率的でしょう。

投稿2020/03/17 03:39

編集2020/03/17 15:14
TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shibainu85

2020/03/17 06:43

配列の仕様、とても勉強になります deepcopy等についてはもう一人の回答者の方のサイトを見て学んでみたいと思います。 ありがとうございました!
TakaiY

2020/03/17 15:17

これは、配列の仕様ではなく、dictionaryなどでも同じです。
guest

0

自己解決

res2=np.array(res)

とすることでもとの配列に影響を及ぼさなくなったのでとりあえずこちらでいこうかと思います。

投稿2020/03/17 03:34

shibainu85

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問