【发布时间】:2015-06-12 15:56:22
【问题描述】:
我正在尝试复制copy.deepcopy 的行为。我有一个行为非常奇怪的方法。
def ReplicateIterable(i):
try:
if len(i) > 1:
return [ReplicateIterable(e) for e in i]
else:
return i
except TypeError:
return i
这是我的功能。 try 块用于捕获不可迭代的对象。我遇到了一些无限递归问题,因为字符串是可迭代的,并且我使用字符作为列表的元素,因此它会在递归之前检查可迭代长度是否为 >1。
我在测试用例中得到了这种行为:
>>> State = [['a', 'b', 'b', 'b', 'c', 'c', 'c'], []]
>>> TempState = ReplicateIterable(State)
>>> TempState
[['a', 'b', 'b', 'b', 'c', 'c', 'c'], []]
>>> TempState[0].remove('c')
>>> TempState[1].append('c')
>>> State
[['a', 'b', 'b', 'b', 'c', 'c', 'c'], ['c']]
>>> TempState
[['a', 'b', 'b', 'b', 'c', 'c'], ['c']]
显然,TempState[0]不指向State[0],但TempState[1]确实指向到State[1]。 State[0] 被TempState[0].remove('c') 操作保持不变,但State[1] 和TempState[1] 都被TempState[1].append('c') 修改。
为什么会出现这种情况?如何预防?
【问题讨论】:
标签: python python-3.x recursion copy iterable