变量引用列表对象与(某些)其他对象不同?

时间:2017-06-06 23:57:39

标签: python python-3.x methods

在定义列表对象的变量时,例如:

x = [1,2,0.2,3,4]
y = x
x.sort()

我希望y仍然等于[1, 2, 0.2, 3, 4],但事实并非如此。 y的值已更改,x已更改。为了解决这个问题,我发现使用y = x.copy()可以保留第一行中的值。

另一方面,另一个例子:

x = 5
y = x
x = 4

由此y的值仍然是5,它不会随着x更改而改变。

我的问题:这是由于列表类中的设计,还是有另一种解释?我发现使用x.append(value)时也会发生动态变化。任何见解都表示赞赏。此致,Arief

2 个答案:

答案 0 :(得分:2)

每个变量只是一个指向Python对象的指针,如果你有两个指向同一个对象的变量,那么你会看到每个变量的变化(并且.sort就地工作,如果你想要的话一个新的list你应该使用x = sorted(x))。但是,如果重新分配变量,则它将指向另一个对象。

我提供了一些图片,以便更好地了解正在发生的事情(不是高质量的,但我希望它能传达信息)。

x = [1,2,0.2,3,4]
y = x

enter image description here

如果您copy(这是一个浅层副本,所以列表内容仍然引用相同的项目!):

x = [1,2,0.2,3,4]
y = x.copy()

enter image description here

你的第二个案例是一样的:

x = 5
y = x

enter image description here

然后你重新分配变量x(所以它之后指向另一个对象):

x = 4

enter image description here

答案 1 :(得分:0)

问题是,yx只是对班级列表的引用。

当您执行以下操作时:

y=x

你正在处理班级的引用,而不是创建另一个班级。

使用copy时,您正在创建一个正在创建新类的浅层副本,将所有元素再次复制到此新对象。

Python manual提供了解释,其他操作员用来实际复制完整的课程。