我在Python 2.7中遇到列表别名或变量赋值的问题。我将向您展示一个最小的例子。有和没有断言的有两个不同的结果,我不知道断言为什么/如何影响它。
当我向下面显示的object_list
添加内容时,它会以某种方式覆盖属性:
class Object1(object):
def __init__(self):
self.object_list = []
def add_thing(self, thing):
# this next line makes all the difference
assert thing.name not in [thing.name for thing in self.object_list], 'agent id already exists, use another one'
self.object_list.append(thing)
class Thing(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
这是一个最小的例子:
使用断言
mfd = Object1()
myAgent = Thing('blah')
myAgent_2 = Thing('blew')
mfd.add_thing(myAgent)
mfd.add_thing(myAgent_2)
print mfd.object_list
>> [blah, blah]
没有断言
mfd = Object1()
myAgent = Thing('blah')
myAgent_2 = Thing('blew')
mfd.add_thing(myAgent)
mfd.add_thing(myAgent_2)
print mfd.object_list
>> [blah, blew]
有人可以向我解释上面的断言是如何影响这个的吗?谢谢。
答案 0 :(得分:6)
在python 2中,在列表解析范围内进行的隐式赋值在对调用者范围的理解之外泄漏。
因此,在您的示例中,通过执行断言,thing
的值更改,thing
的最终值是object_list
的最终值。因此,如果没有assert
,则会添加与执行断言后不同的内容。