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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1032閲覧

for文でスコープは変わらないのに値が変わるのか

nomaluu

総合スコア34

スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/06 09:41

質問

**[https://note.com/keisuke_funabiki/n/nec9df628f77c#Vyjlp]のサイトの「ABC081B - Shift only」**の以下のコードにおいて質問がございます。

python

1n = input() 2a = list(map(int, input().split())) 3ans = float('inf') 4for i in a: 5 ans = min(ans, len(bin(i)) - bin(i).rfind('1') - 1) 6print(ans)

入力例
3
8 12 40

出力
2


上のコードの最後の行で、print(ans)は for文のブロック内にはなく、また
**[https://lanchesters.site/python-min-max/#min]**において

「for 文の場合も if 文のときと同様、内側も外側もスコープが変わらない」

とあるのni、print(ans)の引数はfor文の最後の引数(入力例の場合 40)のときの値になぜならないのかご教授お願い致します。

環境

vscode
windows10
python3.9.5

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

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

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

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

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

otn

2021/09/06 09:54

> なぜならないのか なってますが、なぜなってないと思ったのでしょうか?
nomaluu

2021/09/06 10:05

ans = min(ans, len(bin(i)) - bin(i).rfind('1') - 1) のans の値が変わるとprint(ans)の要素も変わる、というのはあってますか??
otn

2021/09/06 10:06

そうですね。i が 40 の時の ans の値は 2 なので、そのままprintされます。
nomaluu

2021/09/06 10:15

40は二進数すると10100なので3じゃないのでしょうか? >「>なぜならないのか」と思ったのか a が40の時のansの値が3で値が更新されるのに3から2にどうして変わるのでしょう、と思ったからです。
otn

2021/09/06 10:19

min(2,3) は 2 です。
nomaluu

2021/09/06 10:20

min(∞,3)ではないのでしょうか?
nomaluu

2021/09/06 10:22

aが8の時 min(∞,3) aが12の時 min(3,2) aが40の時 min(2,3) ということですか?
otn

2021/09/06 10:28

そりゃそうです。ansはどんどん更新されます。代入しているのに値が変わらないと思っていたのですか?
nomaluu

2021/09/06 10:30

aが8の時 min(∞,3) aが12の時 min(∞,2) aが40の時 min(∞,3) とmin() ないで毎回∞が入っていると思ってました。
nomaluu

2021/09/06 10:32

それで最後のmin(∞,3)の値がprint(ans)に代入されるので出力が3になるので質問した次第です
otn

2021/09/06 10:45

minの第一引数はansなので、その時点のansつまり、前回の代入結果が使われます。 ansが常に∞だと思っていたのなら、最後のprint(ans)はinfを表示すると思わないとおかしい。
nomaluu

2021/09/06 10:47

質問解決できました。ありがとうございます
otn

2021/09/06 10:49

自分で回答として投稿しましょう。
guest

回答3

0

自己解決

aが8の時
min(∞,3)

aが12の時
min(3,2)

aが40の時
min(2,3)

を間違って

aが8の時
min(∞,3)

aが12の時
min(∞,2)

aが40の時
min(∞,3)

とmin() において、毎回∞が入ると思って質問していました。

投稿2021/09/06 10:49

nomaluu

総合スコア34

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

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

0

その解説、意味が違うと思います。

質問者さんはおそらく、「for文等のブロック内で処理してもそれ以外の場所では関係が無い」というような感じで取っているのではないかと。

n = input() a = list(map(int, input().split())) ans = float('inf') # ← これ(1) for i in a: ans = min(ans, len(bin(i)) - bin(i).rfind('1') - 1) # ← これ(2) print(ans)

のこれ(1), (2)は別物……的な意味とか。

そういう意味じゃないと思います。

多分ですが、変数 i のことを言ってるのではないかと。

ただ、質問にある説明だと紛らわしいですね……

投稿2021/09/06 10:05

BeatStar

総合スコア4962

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

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

0

python

1 ans = min(ans, len(bin(i)) - bin(i).rfind('1') - 1)

ではansに40を代入していないからです。

python

1>>> print(bin(40)) 20b101000

などの意味をちゃんと調べましょう。

公式ドキュメント bin(x)をまず読んでください。

投稿2021/09/06 09:56

編集2021/09/06 09:58
ppaul

総合スコア24670

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

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

nomaluu

2021/09/06 10:29

回答ありがとうございます。bin()については理解しております。 「ではansに40を代入していないからです。」についてansに40を代入する理由がわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問