Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在循环中创建实例变量不会返回任何对象_Python_Python 3.x_Class_Attributes - Fatal编程技术网

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