【问题标题】:Comparing lists by reference vs value in Python在 Python 中按引用与值比较列表
【发布时间】:2012-12-14 09:29:15
【问题描述】:

我目前正在学习 Python 3.2 版本。

给定两个列表变量,您如何区分变量引用的是相同的列表还是两个具有相同值的单独列表。

例如:

>>> foo = [1,2,3,4]
>>> bar = foo
>>> foo.append(5)
>>> foo
[1, 2, 3, 4, 5]
>>> bar
[1, 2, 3, 4, 5]
>>> foo == bar
True

在上面,“foo”和“bar”显然引用了同一个列表。 (通过将“5”附加到 foo 并看到该更改也反映在 bar 中来证明)。

现在,让我们定义第三个列表,称为“其他”,具有相同的值:

>>> other = [1,2,3,4,5]
>>> other == foo
True

考虑到这里的比较运算符也返回 True,它们肯定看起来像同一个列表。但是如果我们修改“other”,我们可以看到它是一个不同的列表,其中任一变量的更改都不会影响另一个。

>>> other.append(6)
>>> other == foo
False
>>> other
[1, 2, 3, 4, 5, 6]
>>> foo
[1, 2, 3, 4, 5]

我认为了解两个变量何时是彼此的别名与结构相同是很有用的。但我怀疑我可能误解了该语言的其他基本内容。

【问题讨论】:

  • 您正在这里寻找is

标签: python python-3.x


【解决方案1】:

您可以使用is operator 来确定对象身份:

>>> foo is bar
True
>>> foo is other
False

引用文档:

运算符isis not 测试对象身份:当且仅当xy 是同一个对象时,x is y 为真。 x is not y 产生逆真值。

检测两个变量是否引用同一个对象(例如列表)的另一种方法是检查id() function的返回值:

>>> id(foo)
4432316608
>>> id(bar)
4432316608
>>> id(other)
4432420232

【讨论】:

  • 另外,如果我使用for value in myListin 运算符将使用is==。那么in 运算符是否检查值的标识是否在列表中,或者是否仅按值等于它?
  • @AgentM:这与in 运算符无关,那是for ... in ... loop statement,它使用iteration
  • 对不起,我的意思是:if value in myList 不是for。不知道为什么我花了这么长时间才意识到自己的错误。
  • @AgentM: in 同时使用is==,(首先测试身份,因为这样更有利于性能)。
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多