【发布时间】:2014-05-25 10:56:43
【问题描述】:
如果您在 python 中有一个列表(原始),例如:
class CustomID (object):
def __init__(self, *args):
self.ID = ''
self.manymore = float()
self.visited = False
self.isnoise = False
IDlist = ['1','2','3','4','5','6','7','8','9','10']
Original = list()
for IDs in IDlist:
NewObject = CustomID()
NewObject.ID = IDs
Original.append(NewObject)
如果您对新列表和要在理解子列表上使用的函数进行理解:
def Func(InputList=list()):
for objects in InputList:
objects.visited = True
return InputList
New_List = [member for member in Original if (int(member.ID)>5)]
ThirdList = Func(New_List)
这 (New_List) 是否会导致原始列表的浅拷贝或深拷贝?这件事与我有关,如果原始列表包含对象,哪些属性可以在代码中更改以跟随 New_List 创建(ThirdList)。 New_list 被发送到一个函数,该函数将更改属性。问题是您是否尝试将原始列表重用于具有不同理解的相同功能(比如说 (members>4)。
New_List = [member for member in Original if (int(member.ID)>4)]
其实:
print New_List[3].visited
给出真值。
【问题讨论】:
-
你为什么不试试(除了列表中的数字)? (剧透:这是一个浅拷贝。为什么它应该是深拷贝?您在列表理解中明确使用原始
members。)顺便说一句,您的New_List是set... -
切片类似于深拷贝。这已经足够了,因为 a 没有嵌套列表。我不确定理解是否会产生类似于切片的深拷贝输出。
-
@MartijnPieters:是的,抱歉,我纠正了错字。现在是一个列表:-)
-
@Ivaylo 它看起来像一个深拷贝,因为在您的两个示例中,您都使用不可变类型。此外,您正在为列表元素 (
list2[1] = 'x') 分配新值,而不是 更改 列表元素。尝试相同的操作,例如列表列表和list2[1].append(stuff)。 -
@Ivaylo:这完全取决于您的列表包含的内容。如果您在该列表中有复杂的可变对象也需要复制而不是共享,则使用
copy.deepcopy()或扩展您的自定义对象以添加.copy()方法,该方法创建仅复制无法共享的新对象。跨度>
标签: python list python-2.7 list-comprehension