在Python中更改实例变量也会更改原始列表

时间:2017-11-03 17:50:58

标签: python python-3.x object instance instance-variables

这是我的代码:

class Foo(object):
    def __init__(self, x, y):
        self.x     = x
        self.y     = y

    def func(self):
        self.x[0] -= 1
        self.y    -= 1


x = [10]
y = 10



a = Foo(x, y)
a.func()

print(x, y)

输出为([9], 10)。为什么将列表传递给实例变量然后更改实例变量也会更改原始列表,而不是原始整数?

如何将列表传递给Python中的实例变量,然后更改实例变量而不影响原始列表?

2 个答案:

答案 0 :(得分:1)

我相信这是因为列表是可变的,而整数是不可变的。对列表进行更改后,将返回相同的列表。更改整数后,将返回整数的“副本”。因此,func正在更改x,但会创建新的y

答案 1 :(得分:0)

该列表是一个可变对象;赋值复制引用,以便在更改一个元素的值时更改原始对象。

整数不可变;当您更改值时,Python会使用新值更改对新对象的引用。 self.y不再引用与y相同的对象。