1

有谁知道为什么下面的代码会打印 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()   
4

2 回答 2

2

因为y从不1

>>> range(1)
[0]

你想要的是range(2)

并且以防万一你不知道......目前你正在使用ab作为类属性而不是实例属性。对于您进行值分配的特定情况,您不会看到问题,但是如果您定义了字典或列表,并且正在更改这些对象的键/索引,那么它将是所有对象共享的同一个对象实例。

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'}

...与实例属性

class Myclass(object):
    def __init__(self):
        self.a = []
        self.b = {}
于 2012-12-31T03:43:48.780 回答
1

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

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

于 2012-12-31T03:43:52.870 回答