🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

3回答

785閲覧

Python 簡単なfor文

pussy_pussy

総合スコア22

Python 3.x

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

0グッド

0クリップ

投稿2021/02/01 06:15

Python

1def list_xn(v,n): 2 for i in v: 3 i=i*n 4 return v 5 6v1 = [0, 1, 10] 7v2 = list_xn(v1, 3) 8print(v1) 9print(v2)

想定していた出力
[0, 1, 10]
[0, 3, 30]

実際の出力
[0, 1, 10]
[0, 1, 10]

コードのどこに問題があるのかを教えていただきたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

pythonでは、

for i in v:

のiは、vという列の中の何番目かの場所という意味ではなく、
vという列の何番目かに入っているものを変数iに束縛したもの
という意味です。

名前づけと束縛

そのため、iの値を変えても列(このプログラムの場合にはリスト)自体は変わりません。
vに入っているものを変えるには、v[1] = 3のような代入をする必要があります。

python

1def list_xn(v,n): 2 v2 = v.copy() 3 for i in range(len(v)): 4 v2[i] = v[i] * n 5 return v2

を使えば、

python

1>>> v1 = [0, 1, 10] 2>>> v2 = list_xn(v1, 3) 3>>> print(v1) 4[0, 1, 10] 5>>> print(v2) 6[0, 3, 30]

となります。

投稿2021/02/01 06:51

ppaul

総合スコア24670

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

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

pussy_pussy

2021/02/01 07:25

ご丁寧にありがとうございます。 追加になるのですが、 def list_xn(v,n): for i in range(len(v)): v[i]=v[i]*n return v v1 = [0, 1, 10] v2 = list_xn(v1, 3) print(v1) print(v2) としたときにv1も上書きされてしまうのはなぜでしょうか。 (恐らく言い換えると、ppaulさんが関数内でcopyをする理由)
ppaul

2021/02/01 07:55 編集

そうならないように、copyしてあります。 pythonの変数とオブジェクトは束縛されています。v1に束縛されているリスト[0, 1, 10]は関数list_xnのなかではvと束縛されます。copyしないで、v2[i] = v[i]*nを行うということは、v1に束縛されているリストそのものを変更することになります。 オブジェクトが同じかどうかはid関数を使えばわかります。 私の書いたコードでは、id(v1)とid(v2)は違う数字になりますが、copyをしないとid(v1)とid(v2)が同じになります。 print(id(v1)==id(v2)) などをやって確かめてみてください。
guest

0

引数として受け取ったvをそのまま返してます。

投稿2021/02/01 06:24

norapomu

総合スコア224

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

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

pussy_pussy

2021/02/01 06:37

リストの各項目がn倍されたリストを返すにはどのようにすればよいでしょうか。
guest

0

list_xn内で、vは変化しないですね
掛け算の結果のiも捨てられてるだけです

投稿2021/02/01 06:24

y_waiwai

総合スコア88038

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

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

pussy_pussy

2021/02/01 06:50

リストの各項目がn倍されたリストを返すにはどのようにすればよいでしょうか。
y_waiwai

2021/02/01 06:58

リストの各項目をn倍したリストを作ればどうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問