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

Python 变量引用列表对象与(某些)其他对象的引用列表对象不同?,python,python-3.x,methods,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的变化而变化 我的问题:这是因为list的类中的设计,还是有其他解释?我发现使用x.append(value)时也会发生动态变化。任何见解都值

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

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
的变化而变化


我的问题:这是因为list的类中的设计,还是有其他解释?我发现使用
x.append(value)
时也会发生动态变化。任何见解都值得赞赏。在这方面,Arief

每个变量都只是一个指向Python对象的指针,如果您有两个变量指向同一个对象,那么您将看到每个变量的变化(并且
.sort
可以正常工作,如果您想要一个新的
列表
,您应该使用
x=sorted(x)
)。但是,如果重新分配变量,它将指向不同的对象


我包括了一些图像,以便更好地可视化正在发生的事情(不是高质量的,但我希望它能传达信息)

如果您
复制
(这是一个浅拷贝,因此列表内容仍然引用相同的项目!):

您的第二个案例完全相同:

x = 5
y = x

但随后您重新分配变量
x
(因此它随后指向另一个对象):


每个变量都只是一个指向Python对象的指针,如果有两个变量指向同一个对象,那么您将看到每个变量中的变化(并且
.sort
工作正常,如果您想要一个新的
列表
您应该使用
x=sorted(x)
)。但是,如果重新分配变量,它将指向不同的对象


我包括了一些图像,以便更好地可视化正在发生的事情(不是高质量的,但我希望它能传达信息)

如果您
复制
(这是一个浅拷贝,因此列表内容仍然引用相同的项目!):

您的第二个案例完全相同:

x = 5
y = x

但随后您重新分配变量
x
(因此它随后指向另一个对象):


问题是,
y
x
只是类列表的引用

当您执行以下操作时:

y=x
您正在处理类的引用,而不是创建另一个引用

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


提供一个解释和其他用于实际复制完整类的运算符。

问题是,
y
x
只是类列表的引用

当您执行以下操作时:

y=x
您正在处理类的引用,而不是创建另一个引用

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


提供了一个解释和其他用于实际复制完整类的操作符。

必读:@Arief我刚刚看到您包含了“感谢您的任何见解。向您致意,Arief”。这样的问候是必须的:@Arief我刚刚看到你被列入了“感谢你的任何洞察力。问候你,Arief”。这样的问候是正确的。谢谢你的洞察力和回答。所以这不像如果
x=[1,2,3]
,那么
x
就有值
[1,2,3]
。但是,据我所知,它只是意味着列表对象
[1,2,3]
可以被
x
调用。如果一个变量引用另一个变量:
y=x
,那么它可以被视为两次传递引用,调用
y
与调用
x
然后调用现有对象
[1,2,3]
是一样的。它们依赖于同一个对象。谢谢你的洞察力和回答。所以这不像如果
x=[1,2,3]
,那么
x
就有值
[1,2,3]
。但是,据我所知,它只是意味着列表对象
[1,2,3]
可以被
x
调用。如果一个变量引用另一个变量:
y=x
,那么它可以被视为两次传递引用,调用
y
与调用
x
然后调用现有对象
[1,2,3]
是一样的。它们依赖于同一个对象。当做
y=x