在定义列表对象的变量时,例如:
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
答案 0 :(得分:2)
每个变量只是一个指向Python对象的指针,如果你有两个指向同一个对象的变量,那么你会看到每个变量的变化(并且.sort
就地工作,如果你想要的话一个新的list
你应该使用x = sorted(x)
)。但是,如果重新分配变量,则它将指向另一个对象。
我提供了一些图片,以便更好地了解正在发生的事情(不是高质量的,但我希望它能传达信息)。
x = [1,2,0.2,3,4]
y = x
如果您copy
(这是一个浅层副本,所以列表内容仍然引用相同的项目!):
x = [1,2,0.2,3,4]
y = x.copy()
你的第二个案例是一样的:
x = 5
y = x
然后你重新分配变量x
(所以它之后指向另一个对象):
x = 4
答案 1 :(得分:0)
问题是,y
和x
只是对班级列表的引用。
当您执行以下操作时:
y=x
你正在处理班级的引用,而不是创建另一个班级。
使用copy
时,您正在创建一个正在创建新类的浅层副本,将所有元素再次复制到此新对象。
Python manual提供了解释,其他操作员用来实际复制完整的课程。