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