蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]相关的知识,希望对你有一定的参考价值。

这个问题已经在这里有一个答案:

对象列表是全球性的,如果追加,但如果列表=值

我创建了一个类,它接受一个列表,并使用它的数学函数。不管怎么说,我注意到系统一个奇怪的怪癖:如果我追加元素x的列表,在类中的所有对象访问它,但如果我设置列表= X,比单是本地的。 X也是一个列表。

class Wrong:
    list=[]

    def __init__(self, foo):
        for i in foo:
            self.list.append(i)

class Right:
    list=[]

    def __init__(self, foo):
        self.list=foo

list=[1,2,3]
wrong1 = Wrong(list)
wrong2 = Wrong(list)
right1 = Right(list)
right2 = Right(list)

print(wrong1.list)
print(wrong2.list)
print(right1.list)
print(right2.list)

我期望的输出是一样的,但是在打印时,它的

[1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3]
[1, 2, 3]
[1, 2, 3]

我使用python 3.7.2,在改变任何东西的情况下。

答案

你只需要定义__init__函数内部列表:

class Wrong:

    def __init__(self, foo):
        self.y = []
        for i in foo:
            self.y.append(i)

class Right:

    def __init__(self, foo):
        self.z = foo

x = [1,2,3]
wrong1 = Wrong(x)
wrong2 = Wrong(x)
right1 = Right(x)
right2 = Right(x)

print(wrong1.y)
print(wrong2.y)
print(right1.z)
print(right2.z)
另一答案

你误会了什么类属性和实例属性。在第一个例子中,你已经声明Wrong.list因为这将跨越Wrong的所有实例共享的类属性。在第二个例子中,你已经创建Right的一个实例,然后替换它的参照类属性Right.list一个新的参考的命名self.list实例属性。访问属性时,查找层次是这样的:

  1. 请求属性<name>
  2. 检查的实例属性存在<name>。如果是的话,返回。
  3. 如果没有实例属性中找到,检查是否存在<name>类属性。如果是的话,返回。
  4. 返回AttributeError的,因为这种情况下没有命名的属性。

这不是它的错误做任何事情,那就是你没有完全跟随它在做什么你。

以上是关于蟒蛇使局部类变量,全局如果使用list.append(X),但如果列表= X [复制]的主要内容,如果未能解决你的问题,请参考以下文章

3.ruby语法基础,全部变量,实例变量,类变量,局部变量的使用和注意的要点

局部变量和全局变量

局部变量和全局变量

python函数中局部变量与全局变量遵守规则

c语言局部变量可以被其他的原文件引用吗

什么是全局变量