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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3995閲覧

2次元配列に配列を追加する挙動がおかしい

aiai8976

総合スコア112

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/01/14 02:15

編集2021/01/14 02:26

前提・実現したいこと

2次元配列かつ初期値を空配列にして配列を格納していきたいのですが、挙動がおかしくて困っています。
sampleのような挙動をしたいのですが、実際は全ての要素に同じ値が入ってしまいます。
何が問題なのでしょうか。
わかる方がいましたらコメントお願いします。

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

python

1# print(sample) 2[[[[1, 2, 3]], [], []], [[], [], []], [[], [], []]] 3# print(array[0]) 4[[[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]], [[1, 1, 1]]]

該当のソースコード

array = [[[]] * 11 for i in range(10)] print('---') print(array) print('---') count = 0 sample = [[[], [], []], [[], [], []], [[], [], []]] print(sample) sample[0][0].append([1,2,3]) print(sample) array[0][0].append([1, 1, 1]) print(array[0])

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

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

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

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

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

guest

回答2

0

以下の記事を読むことをおすすめします。
3. 内包表記と掛け算の違い - Python でリストを初期化する。 | 民主主義に乾杯

Python のイミュータブル, immutable ってなに? | 民主主義に乾杯


失敗例:

python

1array = [[[]] * 11 for i in range(10)] 2 3id(array[0][0]) == id(array[0][1]) 4# True 5 6array[0][0].append('a') 7print(array[0]) 8# [['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a']]

成功例:

python

1array = [[[] for _ in range(11)] for i in range(10)] 2 3id(array[0][0]) == id(array[0][1]) 4# False 5 6array[0][0].append('a') 7print(array[0]) 8# [['a'], [], [], [], [], [], [], [], [], [], []]

投稿2021/01/14 02:34

kirara0048

総合スコア1399

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

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

0

ベストアンサー

下記を試してみてください。
pythonで[[]] * 11のように積で配列を多数生成しようとすると、同じIDのものが複製されるため、どれかを変更すると全て同じように変更されてしまいます。
なので、積ではない方法で生成してあげる必要があります。

python3

1array = [[[] for j in range(11)] for i in range(10)] 2print('---') 3print(array) 4print('---') 5count = 0 6 7sample = [[[], [], []], [[], [], []], [[], [], []]] 8print(sample) 9sample[0][0].append([1,2,3]) 10print(sample) 11 12array[0][0].append([1, 1, 1]) 13print(array[0])

投稿2021/01/14 02:28

jeanbiego

総合スコア3966

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問