有人可以告诉我为什么,在我运行下面的代码之后,这些是变量现在引用的值:
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)
该声明:
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.所以,y1和y仍在[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.
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |