有没有人知道为什么下面的代码打印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()
答案 0 :(得分:2)
因为y
永远不会1
:
>>> range(1)
[0]
你想要的是range(2)
只是因为你不知道......目前你使用a
和b
作为类属性而不是实例属性。对于您进行值赋值的特定情况,您不会看到问题,但如果您已经定义了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
- 即实际的类,而不是您创建的实例 - 附加到列表中,因此您始终打印未修改的类来自班级的a
和b
。