
[code]

    num_list = [[0 * 100]] * 2 
    for i in range(4): 
        for j in range(100): 
            num_list[i].append(j)
    
    print(num_list)
    
[/code]

として

[code]

    [[0, 1, 2, 3 -- 100], [0, 1, 2, 3 -- 100]]
    
[/code]

のような配列を作りたいのですが、結果として

[code]

    [[0, 1, 2, 3 -- 100, 0, 1, 2, 3 -- 100],[0, 1, 2, 3 -- 100, 0, 1, 2, 3 -- 100]]
    
[/code]

となってしまいます。

明らかにイテレーションの理解不足だと思うのですが、  
どなたかご助言していただけないでしょうか。


CC BY-SA 3.0
2017-03-31T21:05:18.177
33681
2017-04-01T06:03:32.430
2017-04-01T06:03:32.430
3054
21306
question
python3
入れ子構造for文のイテレーション


分かりやすく書くとこんな感じじゃないでしょうか。

[code]

    # python3 --
    num_list = []
    for _ in range(2):
        nums = []
        for num in range(101):
            nums.append(num)
        num_list.append(nums)
    print(num_list)
    
[/code]

短く書きたいのであれば、下記のようにすれば良いです。

[code]

    # python3 --
    num_list = [list(range(101))] * 2
    print(num_list)
    
[/code]

UPDATE

ラッシーさんから指摘があったので追記します。

上記の書き方だと、num_list にある ２つのリストは同じオブジェクトが参照されてしまうので、  
あまり良い書き方ではありませんでした。以下のようなことが起きてしまいます。

[code]

     # python3 --
     num_list = [list(range(101))] * 2
     num_list[0][0] = 999
     # 1番目のリストの最初の要素を書き換えると、同じオブジェクトを参照してるので
     # 2番目のリストの最初の要素の値も書き換わってしまう
     print(num_list[1][0]) # => 999
    
[/code]

あらためて、２つのリストを独立させた状態で生成する方法を記載します。

[code]

    # python3 --
    num_list = [list(range(101)) for _ in range(2)]
    
[/code]


CC BY-SA 3.0
2017-03-31T23:55:31.970
33684
2017-04-01T03:07:23.993
2017-04-01T03:07:23.993
2168
2168
33681
answer