Python:为什么这是执行时的输出?

Tok*_*oki 2 python copy list

有人可以告诉我为什么,在我运行下面的代码之后,这些是变量现在引用的值:

x = [1, 2, 3, 5] 
x1 = [1, 2, 3, 5] 
x2 = [1, 2, 3] 
y = [1, 2, 3] 
y1 = [1, 2, 3] 
y2 = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

为什么不y = [1, 2, 3, 5]呢?

为什么不x1 = [1, 2, 3]呢?

因为,遵循这个逻辑:

a = 1
b = a
a = 3
b is still equal to 1, not 3.
Run Code Online (Sandbox Code Playgroud)

代码如下.谢谢你的帮助.

def my_function(x, y):
    x.append(5)
    y = y + [5]


x = [1, 2, 3]
x1 = x
x2 = x[:]


y = [1, 2, 3]
y1 = y
y2 = y[:]


my_function(x, y)
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 5

该声明:

x1 = x
Run Code Online (Sandbox Code Playgroud)

创建指向同一列表的引用副本x.现在您要传递x给函数,在该函数中将值附加到x:

x.append(5)
Run Code Online (Sandbox Code Playgroud)

这将影响原始x函数外部指向的列表,并最终也反映出修改x1.因此x1[1, 2, 3, 5].


现在,如果是y1,唯一的区别是函数中的这一行:

y = y + [5]
Run Code Online (Sandbox Code Playgroud)

此行不会更改y函数外部引用的原始列表.它创建一个局部变量y,并将其初始化为[1, 2, 3, 5].但它不会更改y函数外部引用的原始列表,因此不会更改列表y1.所以,y1y仍在[1, 2, 3].


您可以通过检查id函数内部列表和外部列表来验证它:

>>> def my_function(x, y):
...     x.append(5)
...     y = y + [5]
...     return x, y   
... 
>>> 
>>> x = [1, 2, 3]
>>> x1 = x
>>> y = [1, 2, 3]
>>> y1 = y
>>> 
>>> x2, y2 = my_function(x, y)
>>> 
>>> id(x2) == id(x)   
True
>>> id(y2) == id(y)
False
Run Code Online (Sandbox Code Playgroud)

因此,很明显id原始版本x与函数返回的版本相同.但是id原件y与退回的不一样y.