Iva*_*ylo 5 python list-comprehension list python-2.7
如果你有一个 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)
Run Code Online (Sandbox Code Playgroud)
如果您对新列表和要在理解子列表上使用的函数进行理解:
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)
Run Code Online (Sandbox Code Playgroud)
这(New_List)会导致原始列表的浅副本还是深副本?这个问题与我相关,如果原始列表包含对象,则可以在代码中更改哪些属性以跟随 New_List 创建(ThirdList)。New_list 被发送到一个函数,该函数将更改属性。问题是,如果您尝试以不同的理解重用同一函数的原始列表(假设(成员> 4))。
New_List = [member for member in Original if (int(member.ID)>4)]
Run Code Online (Sandbox Code Playgroud)
实际上:
print New_List[3].visited
Run Code Online (Sandbox Code Playgroud)
给出 True.
您正在创建一个浅层、经过过滤的副本。
您的循环不会创建 的副本member,而是直接引用它们。
并不是说您需要创建副本,原始列表中的所有对象都是不可变的整数。此外,CPython 实习生小整数,创建副本只会导致使用完全相同的对象。
为了说明这一点,请尝试创建包含可变对象的列表的副本。这里我用了字典:
>>> sample = [{'foo': 'bar'}]
>>> copy = [s for s in sample]
>>> copy[0]['spam'] = 'eggs'
>>> copy.append({'another': 'dictionary'})
>>> sample
[{'foo': 'bar', 'spam': 'eggs'}]
Run Code Online (Sandbox Code Playgroud)
该copy列表是一个新的列表对象,其中包含对 中包含的同一字典的引用sample。更改该字典会反映在copy和中sample,但附加到copy不会更改原始列表。
至于更新后的循环代码,您的示例生成一个New_List仍然共享对象的列表,New_List[3].visited实际上是True:
>>> New_List[3].ID
'8'
>>> New_List[3].visited
True
Run Code Online (Sandbox Code Playgroud)
因为它仍然是在索引 7 处找到的同一对象Original:
>>> New_List[3] is Original[7]
True
Run Code Online (Sandbox Code Playgroud)
ThirdList这是在索引 2 处仍然找到的相同对象:
>>> ThirdList[2] is New_List[3]
True
Run Code Online (Sandbox Code Playgroud)