3

リストを試していて、次のコード セグメントを表示しようとしていました。

----------
---hello--
----------

しかし、これを行うには、3 つの「listSmall」を互いに独立させる必要があります。これを行う方法はありますか?

(

現在の出力はもちろん:

---hello--
---hello--
---hello--

)

listSmall = ['-','-','-','-','-','-','-','-','-','-',]
listBig = [listSmall, listSmall, listSmall]
word = 'hello'
wordPosX = 3
wordPosY = 2

for i in word:
    listBig[wordPosY][wordPosX] = i
    wordPosX = wordPosX + 1

i = 0
while i != 3:
    print ''.join(listBig[i])
    i = i + 1
4

4 に答える 4

5

これはlist可変であるためです。

listBig = [listSmall, listSmall, listSmall]

同じ変更可能なリストを 3 回ポイントするlistBigため、これらの参照のいずれかを介してこの変更可能なリストを変更すると、3 つすべてでこの変更が表示されます。

3 つの異なるリストを作成する必要があります。

listBig = [ ['-'] * 10 for _ in range(3)] 

全く必要ありませんlistSmall

コード全体:

listBig = [ ['-'] * 10 for _ in range(3)] 
word = 'hello'
wordPosX, wordPosY = 3, 1
listBig[wordPosY][3: (3+len(word))] = word
for v in listBig:
    print(''.join(v))
于 2013-04-28T05:32:11.617 に答える
3

コンストラクターを使用listして、の浅いコピーを作成しますlistSmall

listBig = [list(listSmall) for i in range(3)]

もう 1 つの同等の (読みにくい IMO) 方法は、空のスライスを使用することです。

listBig = [listSmall[:] for i in range(3)]
于 2013-04-28T05:29:56.070 に答える
1

listSmall入れたらコピーしたいlistBig。関数を使用してそれを行うことができますlist

listBig = [list(listSmall), list(listSmall), list(listSmall)]
于 2013-04-28T05:30:24.730 に答える
0

最初と最後のリストは引き続き共有できます。よりメモリ効率の良い実装は

listBig = [listSmall, listSmall[:], listSmall]

2 番目のものは、スライス表記を使用してリスト全体のコピーを作成していることに注意してくださいlistSmall

于 2013-04-28T06:16:51.930 に答える