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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Python

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

Q&A

解決済

2回答

711閲覧

シューティングゲームの7*7のデータリストの作成

Qiitahana

総合スコア4

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/10/31 07:03

前提・実現したいこと

課題でシューティングゲーム制作をやります。7*7のゲーム画面をデータで表すためのリストを作り、その一つにプレーヤーを表すPを割り振ろうとしています。(これが完成次第ランダムで発生させた障害物を随時リスト内に追加していくつもりです)

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

リストの特定部分をインデックスで指定しPを割り振ったつもりなのですが、全行の同じ位置([3])にPが発生しています。

該当のソースコード

<入力> row = ["X" for _ in range(7)] grid = [row for _ in range(7)] grid[0][3] = PLAYER <出力> grid [['X', 'X', 'X', 'P', 'X', 'X', 'X'], ['X', 'X', 'X', 'P', 'X', 'X', 'X'], ['X', 'X', 'X', 'P', 'X', 'X', 'X'], 'X', ['X', 'X', 'X', 'P', 'X', 'X', 'X'], ['X', 'X', 'X', 'P', 'X', 'X', 'X'], ['X', 'X', 'X', 'P', 'X', 'X', 'X']]

試したこと

仕方無く全ての行の[3]にPが振られた後最初の行だけ飛ばしてfor loopで[3]にXを振り直してみようと思ったのですが、
今度は全ての行の[3]がXになりました。

<入力>
for i in grid[1:]:
print(i)
i[3] = "X"

<出力>
['X', 'X', 'X', 'P', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X']

grid

[['X', 'X', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X', 'X', 'X']]

(因みに、最初の行を飛ばさず全行に対して[3]へのXの割り振りをした際も、最初の行だけが[3]がPになっていました。単にgridと打った時にそれは反映されません。

補足情報(FW/ツールのバージョンなど)

開発環境: IDLE(Python3.9 64-bit)
Pythonのバージョンも3.9。
ゲームに使うライブラリはTkinter、random、pillow、typingのみ。

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

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

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

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

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

guest

回答2

0

よくある質問です。

公式ドキュメント FAQ なぜ list 'y' を変更すると list 'x' も変更されるのですか?の一つの例です。

多くの方が悩む問題ですね。

投稿2021/10/31 07:43

ppaul

総合スコア24670

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

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

Qiitahana

2021/10/31 07:50

リンク先確認いたしました。ありがちな間違いながら忘れていました…ありがとうございます!
guest

0

ベストアンサー

grid の各行のメモリアドレスをみると全て同じになっています。

python

1>>> row = ["X" for _ in range(7)] 2>>> grid = [row for _ in range(7)] 3>>> _ = [print(id(r)) for r in grid] 4140163625397376 5140163625397376 6140163625397376 7140163625397376 8140163625397376 9140163625397376 10140163625397376

shallow copy になっていますので、row をコピーするか、list comprehension で各行を作成します。

python

1>>> grid = [row[:] for _ in range(7)] 2>>> _ = [print(id(r)) for r in grid] 3140163625443648 4140163625445632 5140163625445568 6140163625445376 7140163625443520 8140163625445760 9140163625446528 10 11>>> grid = [["X" for _ in range(7)] for _ in range(7)] 12>>> _ = [print(id(r)) for r in grid] 13140163625446144 14140163625445888 15140163625446848 16140163625446080 17140163625444608 18140163625446656 19140163625446720

投稿2021/10/31 07:32

melian

総合スコア20655

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

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

Qiitahana

2021/10/31 07:47

丁寧なご解答ありがとうございます!シャローコピーとディープコピーの取り違えが原因だったのですね。お陰様でPを正常に割り振ることができました。お世話になりました。
ppaul

2021/10/31 08:01

melianさん、 Pythonの言語仕様ではidはアドレスではないので、こういう質問への回答でアドレスとは書かない方がよいと思います。 https://docs.python.org/ja/3/library/functions.html#id に、 CPython implementation detail: This is the address of the object in memory. と書いてあるのは、Pythonの実装の一つであるCPython、つまりもっとも普通に使われているPythonではobjectのメモリアドレスだという意味であって、全てのPythonでidがアドレスという意味ではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問