与python中的reverse()函数混淆,为什么它在这个特定问题中反转两个列表

pxiryf3j  于 2022-12-14  发布在  Python
关注(0)|答案(3)|浏览(93)

问题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也反转了
请给予我一个详细的解释。

xoefb8l8

xoefb8l81#

简短的答案是Python中的可变性(这里有一个很好的URL可以阅读更多关于它的内容:https://www.mygreatlearning.com/blog/understanding-mutable-and-immutable-in-python/)。我会尽量简短地解释。
在Python中使用以下语法赋值变量时:

a = [1, 2, 3]
temp = a

实际上,python只是简单地使用一个指针来指向存储创建列表的同一个内存地址,这可以通过python内置的id函数看出:

id(a)
id(temp)

id函数返回对象的标识(或者Python默认安装的Cython的内存地址),你会看到两个变量的内存地址是相同的,这意味着它们指向同一个列表,尽管它们是不同的变量。
因此,当您对变量a调用.reverse()时,该列表将在原处更新(调用reverse后可以再次调用id,注意areverse函数前后的内存地址是相同的),由于变量temp也引用了相同的内存地址。temp现在也引用反向列表。

bzzcjhmw

bzzcjhmw2#

在我的理解中,只有temp变量改变,而x保持不变
temp = x使两个变量指向同一个对象,您可以自己检查:

print(x is temp)
# Prints "True"

要使它们分开,您需要创建x的副本,然后将其分配给temp

kcugc4gi

kcugc4gi3#

temp = x

tempisx-您不是在复制,而是在创建对同一对象的第二个引用。
您可以使用以下命令创建浅副本

temp = x[:]

如果列表x有多个维度,你需要做一个深拷贝,如下所示:

import copy
temp = copy.deepcopy(x)

查看副本文档here,了解更多关于浅副本和深副本的信息。

相关问题