Python 在循环中创建实例变量不会返回任何对象
我尝试了一个小型的Python 在循环中创建实例变量不会返回任何对象,python,python-3.x,class,attributes,Python,Python 3.x,Class,Attributes,我尝试了一个小型的trafficlight实现,得到了以下代码: def __init__(...): ... self.redLight = Light(color = "red", master = self.frame) self.redLight.place(x = 10, y = 10) self.yellowLight = Light(color = "yellow", master = self.frame) self.yellow
trafficlight
实现,得到了以下代码:
def __init__(...):
...
self.redLight = Light(color = "red", master = self.frame)
self.redLight.place(x = 10, y = 10)
self.yellowLight = Light(color = "yellow", master = self.frame)
self.yellowLight.place(x = 10, y = 40)
self.greenLight = Light(color = "green", master = self.frame)
self.greenLight.place(x = 10, y = 70)
...
我觉得很无聊,试图在循环中定义这个相当冗余的代码:
def __init__(...):
...
self.redLight = None
self.yellowLight = None
self.greenLight = None
for l in [[self.redLight, "red", 10],
[self.yellowLight, "yellow", 40],
[self.greenLight, "green", 70]]:
l[0] = Light(color = l[1], master = self.frame)
l[0].place(x = 10, y = l[2])
...
我的理解是,它与第一个代码示例完全相同,但事实证明,它不编写实例变量。当我在调试器中查看代码时,l[0]
对象是一个轻对象
python不是通过引用调用的,所以l[0]
应该直接编写实例变量?这就是and的作用:
因为正如注释中提到的,赋值给l[0]
只会更改局部变量l
的内容,而不会设置实例上的属性
请注意,这归结为:
>>> a = 1
>>> b = a
>>> b = 2 # assigning a new value to "b" doesn't change "a"!
>>> a
1
或:
因此,虽然您可以通过分配给
self来更改属性,但redLight
并不意味着您可以通过为包含对self值的引用的列表分配不同的值来更改属性。redLight
l[0]
是索引0处的列表元素,不是实例变量。但是如果python正确引用它,这不会是一个问题吗?那么,代码> L(0)< /> >将是(与RealLoad < /Cuth> Ty相同的对象),有没有一种方法可以说Python可以像C++一样通过指针来执行,这是相同的对象,所以它们会改变(仅仅从好奇:D)问?很不幸(或者相当幸运)没有。在某些情况下,您可以使用可变类型并对其进行变异来获得类似的结果(例如,如果您将self
的属性更改为dict
。@Steelbean它与指针不完全一样,但您也可以使用functtools.partial
和setattr
来“模拟”动态访问。例如rl=partial(getattr,self,'redLight')
,然后您可以访问rl()
以获取self.redLight
的当前值,同样rls=partial(setattr,self,'redLight')
和rls(value)
以设置self.redLight
。但它仍然需要函数调用,所以我不知道它是否“计数为C++ +指针操作”。如果你愿意,我可以在答案中添加这一点作为完整的例子。
>>> a = 1
>>> b = a
>>> b = 2 # assigning a new value to "b" doesn't change "a"!
>>> a
1
>>> a = 1
>>> b = [a]
>>> b[0] = 2 # won't change "a".
>>> a
1