Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:为什么这是执行时的输出?_Python_List_Copy - Fatal编程技术网

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

Python:为什么这是执行时的输出?,python,list,copy,Python,List,Copy,有人能告诉我为什么在我运行下面的代码之后,这些变量现在引用的值是: 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] 为什么不是y=[1,2,3,5] 为什么不是x1=[1,2,3] 因为按照这个逻辑, a = 1 b = a a = 3 b is still equal to 1, not 3. 代码如下。谢谢你的帮助 def my_funct

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

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]
为什么不是y=[1,2,3,5]

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

因为按照这个逻辑,

a = 1
b = a
a = 3
b is still equal to 1, not 3.
代码如下。谢谢你的帮助

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)
简单。可变对象(如列表)按引用传递,而不可变对象(如整数)按值传递

当您执行
x1=x
时,
x1
指的是
x
;因此对
x
的任何更改也适用于
x1
,因为它们指的是同一个对象
x.append(5)
通过引用更改原始
x
,从而更改
x1

但是,当您执行
x2=x[:]
操作时,您正在通过切片复制列表的内容。因此,您正在创建一个新的
列表

当您执行
y=y+[5]
时,您将在函数的作用域中创建一个新列表。因此,全局
y
(和
y1
通过引用)保持不变
y2
只是原始
y
的一个副本,因此该函数也不会对其产生任何影响。

简单。可变对象(如列表)按引用传递,而不可变对象(如整数)按值传递

当您执行
x1=x
时,
x1
指的是
x
;因此对
x
的任何更改也适用于
x1
,因为它们指的是同一个对象
x.append(5)
通过引用更改原始
x
,从而更改
x1

但是,当您执行
x2=x[:]
操作时,您正在通过切片复制列表的内容。因此,您正在创建一个新的
列表


当您执行
y=y+[5]
时,您将在函数的作用域中创建一个新列表。因此,全局
y
(和
y1
通过引用)保持不变
y2
只是原始
y
的一个副本,因此该函数也不会对其产生任何影响。

您实际上没有更改y的引用,只是将其设置为不同的引用。这实际上不会改变你传入的y。只是my_函数局部范围内的y


单步执行

实际上并没有更改y的引用,只是将其设置为不同的引用。这实际上不会改变你传入的y。只是my_函数局部范围内的y

单步执行该语句:

x1 = x
创建对
x
指向的同一列表的引用副本。现在将
x
传递给函数,在函数中向
x
追加一个值:

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


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

y = y + [5]
此行不会更改函数外部由
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
因此,很明显,原始
x
id
与函数返回的相同。但是原始
y
id
与返回的
y
语句不同:

x1 = x
创建对
x
指向的同一列表的引用副本。现在将
x
传递给函数,在函数中向
x
追加一个值:

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


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

y = y + [5]
此行不会更改函数外部由
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

因此,很明显,原始
x
id
与函数返回的相同。但是原始
y
id
与返回的
y

不一样,您实际上是在处理范围问题。起初,看起来您有别名问题,但您对传入变量的重新定义只在函数中持续。函数运行完成后,传入的参数(简单地说)将返回其原始值。只有在函数中,它们才继续具有您重新分配给它们的值。尝试在函数结束前打印奇数输出。

您实际上是在处理范围问题。起初,看起来您有别名问题,但您对传入变量的重新定义只在函数中持续。函数运行完成后,传入的参数(简单地说)将返回其原始值。只有在函数中,它们才继续具有您重新分配给它们的值。尝试在函数结束前打印奇数输出。

不知道是谁停机了