【问题标题】:Strange inline assignment奇怪的内联赋值
【发布时间】:2015-11-03 13:37:45
【问题描述】:

我正在努力解决 Python(2 和 3)中的这种奇怪行为:

>>> a = [1, 2]
>>> a[a.index(1)], a[a.index(2)] = 2, 1

这会导致:

>>> a
[1, 2]

但是如果你写

>>> a = [1, 2]
>>> a[a.index(1)], a[a.index(2)] = x, y

其中x, y != 2, 1(可以是1, 12, 23, 5 等),这会导致:

>>> a == [x, y]
True

正如人们所期望的那样。为什么a[a.index(1)], a[a.index(2)] = 2, 1 不产生结果a == [2, 1]

>>> a == [2, 1]
False

【问题讨论】:

  • 你问了一个奇怪的问题。为什么a[a.index(1)], a[a.index(2)] = 2, 1 应该打印任何东西? :)
  • 我的意思是在请求 a 的值时。我在滥用符号。 XD
  • 相关(和狡猾):stackoverflow.com/q/32127908/3001761

标签: python tuples variable-assignment


【解决方案1】:

因为它实际上是这样解释的:

>>> a = [1, 2]
>>> a
[1, 2]
>>> a[a.index(1)] = 2
>>> a
[2, 2]
>>> a[a.index(2)] = 1
>>> a
[1, 2]

引用standard rules for assignment(强调我的):

  • 如果目标列表是逗号分隔的目标列表:对象必须是具有与目标相同数量的项目的可迭代对象 在目标列表中,项目被分配,从左到右, 相应的目标。

a[a.index(1)](即a[0])的分配发生在之前第二个分配要求a.index(2),此时a.index(2) == 0

对于任何分配,您都会看到相同的行为:

foo = [a, b]
foo[foo.index(a)], foo[foo.index(b)] = x, y

其中x == b(在这种情况下,右侧第一个值为2 的任何赋值)。

【讨论】:

  • 你能从文档中引用 Python 中的赋值顺序吗?
  • 赞成并接受。感谢您的出色工作!
  • 为什么a = 1; a, b = 2, a 会导致b == 1 呢?您可能想在答案中讨论可变对象和不可变对象之间的区别。
  • @pzp 不可变与不可变,这是因为在任何分配开始之前,右侧已被完全评估。可变的a 也会发生同样的事情。
猜你喜欢
  • 2011-04-08
  • 2013-08-19
  • 2012-12-15
  • 2020-11-08
  • 2014-11-04
  • 1970-01-01
  • 2015-04-01
  • 2017-11-07
相关资源
最近更新 更多