断言如何影响Python中的变量赋值?

Can*_*ic3 0 python assert list assertions python-2.7

我在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
Run Code Online (Sandbox Code Playgroud)

这是一个最小的例子:

随着断言

mfd = Object1()
myAgent = Thing('blah')
myAgent_2 = Thing('blew')

mfd.add_thing(myAgent)
mfd.add_thing(myAgent_2)

print mfd.object_list

>> [blah, blah]
Run Code Online (Sandbox Code Playgroud)

没有断言

mfd = Object1()
myAgent = Thing('blah')
myAgent_2 = Thing('blew')

mfd.add_thing(myAgent)
mfd.add_thing(myAgent_2)

print mfd.object_list

>> [blah, blew]
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释上面的断言是如何影响这个的吗?谢谢.

cow*_*ert 6

在python 2中,在列表解析范围内进行的隐式赋值在对调用者范围的理解之外泄漏.

所以在你的例子中,通过执行断言,thing值的变化和最终值thing是最终的object_list.因此,在没有assert执行断言的情况下,您将添加不同的内容.