问题3:考虑下面的Python函数:
def maf(x):
""" (list)->bool """
temp = x
temp.reverse()
if temp == x:
return True
else:
return False
如果我们调用函数maf与列表a,然后与列表B的值给予:
a = [17、38、10、25、72]
B = [10、30、20、30、10]
每次调用返回的值是什么?
答案(选择一项):
a)maf(a)返回True,maf(B)返回True
B)maf(a)返回真,maf(b)返回假
c)maf(a)返回假,maf(B)返回真
d)maf(a)返回假,maf(B)返回假
我不明白为什么答案是a)。在我的理解中,只有temp变量改变,而x保持不变。thys为什么在两种情况下输出都为真?
之后我去了python,写了这样一段话:
x = [17,2,1]
temp = x
temp.reverse()
print(temp)
print(x)
结果如下:
[一、二、十七]
[第1、2、17条]
为什么我们只反转温度时x也反转了
请给予我一个详细的解释。
3条答案
按热度按时间xoefb8l81#
简短的答案是Python中的可变性(这里有一个很好的URL可以阅读更多关于它的内容:https://www.mygreatlearning.com/blog/understanding-mutable-and-immutable-in-python/)。我会尽量简短地解释。
在Python中使用以下语法赋值变量时:
实际上,python只是简单地使用一个指针来指向存储创建列表的同一个内存地址,这可以通过python内置的
id
函数看出:id
函数返回对象的标识(或者Python默认安装的Cython的内存地址),你会看到两个变量的内存地址是相同的,这意味着它们指向同一个列表,尽管它们是不同的变量。因此,当您对变量
a
调用.reverse()
时,该列表将在原处更新(调用reverse
后可以再次调用id
,注意a
在reverse
函数前后的内存地址是相同的),由于变量temp
也引用了相同的内存地址。temp
现在也引用反向列表。bzzcjhmw2#
在我的理解中,只有temp变量改变,而x保持不变
temp = x
使两个变量指向同一个对象,您可以自己检查:要使它们分开,您需要创建
x
的副本,然后将其分配给temp
。kcugc4gi3#
temp
isx
-您不是在复制,而是在创建对同一对象的第二个引用。您可以使用以下命令创建浅副本
如果列表
x
有多个维度,你需要做一个深拷贝,如下所示:查看副本文档here,了解更多关于浅副本和深副本的信息。