0

変更せずに保持したい別のリストからコピーされたリストに要素を挿入および削除しています。ただし、前者に操作を適用すると、後の結果も変わりました。どうすればそれを回避できますか?

これは何が起こっているかの例です:

a = range(11)

b = []

for i in a:
    b.append(i+1)

print b
#Out[10]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

c = b
# Here, what I expect is to safely save "b" and work on its copy.

c.insert(-1,10.5)

print c
#Out[13]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5, 11]

c.remove(11)
print c

#Out[15]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5]

# So far everything is right: I inserted and removed what I wanted.
# But then, when I check on my "backed-up b", it has been modified:

print b
#Out[16]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5]

# On the other hand, "a" remains the same; it seems the propagation does not affect
# "loop-parenthood":

print a
# Out[17]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

操作が親リストに伝播する理由がわかりません。どうすればそれを回避できますか? リストをアレンジとして保存するか、ループを使用してリストのコピーを作成する必要がありますか?

4

3 に答える 3

4

または を使用して、浅いコピーまたは深いコピー (内部オブジェクトを再帰的にコピーする必要がある場合) を作成する必要がありc = b[:]ますcopy.deepcopy(b)。を実行すると、 byc = bと同じオブジェクトを指す参照が作成されるだけなbので、b変更またはc変更された場合、両方の変数にそれらの変更が反映されます。

>>> a = range(11)
>>> b = []
>>> for i in a:
        b.append(i+1)


>>> print b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> c = b[:]
>>> c.insert(-1, 10.5)
>>> print c
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5, 11]
>>> c.remove(11)
>>> print c
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5]
>>> print b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
于 2013-08-26T15:52:39.457 に答える
3

ディープコピーを作成する必要があります:

import copy 

a = range(11)

b = []

for i in a:
    b.append(i+1)

print b
#Out[10]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

c = copy.deepcopy(b)
# Here, what I expect is to safely save "b" and work on its copy.

c.insert(-1,10.5)

print c
#Out[13]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5, 11]

c.remove(11)
print c

#Out[15]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5]

# So far everything is right: I inserted and removed what I wanted.
# But then, when I check on my "backed-up b", it has been modified:

print b
#Out[16]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10.5]

# On the other hand, "a" remains the same; it seems the propagation do not affect
# "loop-parenthood":

print a

配列のコピーを作成せずに、配列への参照を作成しているだけだからです。コピーの使用方法は次のとおりです。

http://docs.python.org/2/library/copy.html

于 2013-08-26T15:54:14.523 に答える
0

使用する

new_list = old_list[:]

また

new_list = list(old_list)

リストを複製またはコピーする方法は?

于 2013-08-26T15:54:39.683 に答える