@MKsan (MK san)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonにおける、for文のロジックについて

Python初心者です。とある参考書に以下のコードがありました。

def nameModify(names):
    for num in range(len(names)):
        names[num] = names[num] + 'さん'
    return names

beforeNames = ['大川', '田中', '阿部']
afterNames = nameModify(beforeNames)
print(beforeNames)
print(afterNames)

上記のコード上から3行目names[num] = names[num] + 'さん'のところを
なんとなく試しにnames = names[num] + 'さん'と左辺の[num]を消して実行したところ

['大川', '田中', '阿部']
んさん

と、print(afterNames)の箇所が「んさん」となりました。このように表示される理由を教えてください

自分で試したこと

切り分けとして、3行目と4行目の間にprint(names)を追記して実行したところ

大川さん
川さん
んさん
['大川', '田中', '阿部']
んさん

となりました。names[num] + 'さん'のループで
num[0]が「大川さん」
num[1]が「川さん」
num[2]が「んさん」

となるロジックがわからずです・・・

0 likes

1Answer

変数の中身を想像しながら処理を追ってみてください。実際の流れは以下のようになっています。

ループ1回目

#       ┌ 配列 ['大川', '田中', '阿部']
#       │     ┌ 0
names = names[num] + 'さん'
# │     ^^^^^^^^^^
# │     └ 配列 names の0要素目 == '大川'
# └ '大川さん'

ループ2回目

#       ┌ '大川さん'
#       │     ┌ 1
names = names[num] + 'さん'
# │     ^^^^^^^^^^
# │     └ 文字列 names の1文字目 == '川'
# └ '川さん'

ループ3回目

#       ┌ '川さん'
#       │     ┌ 2
names = names[num] + 'さん'
# │     ^^^^^^^^^^
# │     └ 文字列 names の2文字目 == 'ん'
# └ 'んさん'
1Like

Comments

  1. @MKsan

    Questioner

    @uasi さん、コメントありがとうございます!
    ループ2回目と3回目は、ループ1回目で取得した文字列の場所から取得していたんですね。そこに気づけなかったです。

    つまり
    ループ1回目はそのまま要素0を取得後にさんを付与して「大川さん」
    ループ2回目はループ1回目で取得した「大川さん」のnum[1]文字目以降の「川さん」
    ループ3回目はループ2回目で取得した「川さん」のnum[2]文字目以降の「んさん」
    となると理解しましたが、気になるところが出てきました。

    文字列を見ることから
    ループ2回目、3回目ともに「+ 'さん'」があるので
    ループ2回目の処理結果は「川さんさん」
    ループ3回目の処理結果は「んさんさんさん」

    となるのかなと思いますが、なぜ「+ 'さん'」が追加されないのでしょうか。

  2. @MKsan

    ループ2回目はループ1回目で取得した「大川さん」のnum[1]文字目以降の「川さん」

    ここの理解が違っていて、ループ2回目の names[1] で取り出されるのは「大川さん」の1文字目の「川」だけです。そこに + 'さん' して「川さん」になります。

    ループ2回目では「川さん」の2文字目の「ん」に + 'さん' して「んさん」になります。

  3. @MKsan

    Questioner

    @usai さん、コメントありがとうございます!

    ループ1回目はそのまま要素0を取得後にさんを付与して「大川さん」
    ループ2回目は、ループ1回目で取得した「大川さん」の文字列に左から0〜3の数字を割り振り、1つ目の「川」のみ取得後さん付けして「川さん」
    ループ3回目は、ループ2回目で取得した「川さん」の文字列に左から0〜2の数字を割り振り、2つ目の「ん」のみ取得後さん付けして「んさん」

    となるということですね、理解できました!

    この質問はクローズします

Your answer might help someone💌