猿问

在列表的情况下使用共享引用时遇到问题

a=b=[1,2,3]

print (a is b) #True


a=[1,2,3]

print (a is [1,2,3]) #False  

为什么第二部分打印?False


慕桂英3389331
浏览 94回答 3
3回答

慕森卡

Python 中的多重赋值会创建两个指向同一对象的名称。例如>>> a=b=[1,2,3]>>> a[0] = 10>>> b[10, 2, 3]is可用于检查两个名称(和)是否保存对同一内存位置(对象)的引用。因此aba=b=[1,2,3]  # a and b hold the same referenceprint (a is b) # True现在在这个例子中,a = [1,2,3]print (a is [1,2,3]) # Falsea不持有对对象的相同引用,即使 并且是具有相同元素的列表。[1, 2, 3]a[1, 2, 3]如果要比较两个列表是否包含相同的元素,可以使用:==>>> a=b=[1, 2, 3]>>> a == bTrue>>> >>> a = [1, 2, 3]>>> a == [1, 2, 3]True

一只斗牛犬

您的第一个显式地对列表创建的对象进行引用并显示。ab[1,2,3]在第二个代码中,列表显示的两种用法都必然会创建新对象,因为列表是可变的,并且您不希望隐式共享对它们的引用。[1,2,3]list考虑一个更简单的例子:a = []b = []a.append(1)是否也要进行修改?b对于不可变值(如 s),语言实现可能会导致文本重用对现有对象的引用,但这不是可以依赖的。int

四季花海

问题是您正在使用的逻辑运算符。您询问的是这些相同的对象是否与,而不是它们是否相等(相同的数据)。一个是对象的引用,另一个是对象,所以即使它们相等,它们也不相同。is为什么选择您的结果当您设置并作为同一列表时,您正在说并且应该链接并且应该引用相同的数据,以便它们彼此相同,但不是对象,它们是对相同列表的引用。ababab[1,2,3]总结==- 等于(相同)。is- 相同。因此,如果您想检查它们是否相等(相同),请使用:>>> a=[1,2,3]>>> print (a == [1,2,3])True值得一读的类似问题:“==”和“is”之间有区别吗?希望这有帮助,哈利。
随时随地看视频慕课网APP

相关分类

Python
我要回答