简单奇怪的基本python行为

时间:2012-12-31 03:39:34

标签: python

有没有人知道为什么下面的代码打印0和1而不是5和2,在csharp中类似的代码会打印5和2而我只是想在这里解决逻辑。

class Myclass:
    a = 0
    b = 1 

def foo():
    for x in range(1):
        for y in range(1):
            myclass = Myclass()
            if y == 1:
                myclass.a = 5
            if y == 1:
                myclass.b = 2
            ClassList.append(Myclass)

    for x in ClassList:
        print x.a   
        print x.b

ClassList = []
foo()   

2 个答案:

答案 0 :(得分:2)

因为y永远不会1

>>> range(1)
[0]

你想要的是range(2)

只是因为你不知道......目前你使用ab作为类属性而不是实例属性。对于您进行值赋值的特定情况,您不会看到问题,但如果您已经定义了say,dictionaries或list,并且正在更改这些对象的键/索引,那么它将是所有对象共享的相同对象。实例。

class Myclass(object):
    a = []
    b = {}

obj1 = Myclass()
obj2 = Myclass()
obj1.a.append('foo')
obj1.b['biz'] = 'baz'
print obj2.a
# ['foo']
print obj2.b
# {'biz': 'baz'}

... vs实例属性

class Myclass(object):
    def __init__(self):
        self.a = []
        self.b = {}

答案 1 :(得分:1)

原因是range(1)返回[0],而不是[0, 1],因此您的y == 1测试永远不会评估为真。

此外,您将Myclass而不是myclass - 即实际的类,而不是您创建的实例 - 附加到列表中,因此您始终打印未修改的类来自班级的ab