当前位置: 首页 > 面试题库 >

Python赋值运算符优先级-(a,b)= a [b] = {},5

柴衡
2023-03-14
问题内容

我在Twitter上看到了这个Python代码段,并对输出感到困惑:

>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}

这里发生了什么?


问题答案:

Assignment语句
文档中

赋值语句评估表达式列表(请记住,它可以是单个表达式或逗号分隔的列表,后者产生一个元组),并将单个结果对象从左到右分配给每个目标列表。

您有两个分配目标列表;a, b,和a[b],该值{}, 5从左到右分配给这两个目标。

首先,将{}, 5元组解包到a, b。您现在有a = {}b = 5。注意这{}是可变的。

接下来,您将相同的字典和整数分配给a[b],其中a对字典求值,对b进行求值5,因此您5将字典中的键设置为元组,({}, 5)从而创建了循环引用。将{...}由此指相同的对象a已被引用。

由于分配是从左到右进行的,因此您可以将其细分为:

a, b = {}, 5
a[b] = a, b

因此a[b][0]与以下对象相同a

>>> a, b = {}, 5
>>> a[b] = a, b
>>> a
{5: ({...}, 5)}
>>> a[b][0] is a
True


 类似资料:
  • 问题内容: 这是我的第一个问题,我开始学习Python。之间有什么区别: 和 在下面的示例中编写时,它显示不同的结果。 和 问题答案: 在中,在将右侧的表达式赋给左侧之前对其求值。因此,它等效于: 在第二个示例中,运行时已更改的值。因此,结果是不同的。

  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 问题内容: 今天,我发现了python语言一个有趣的“功能”,这让我感到非常悲伤。 那个怎么样?我以为两者是等同的!更糟糕的是,这是我调试时遇到的麻烦的代码 WTF!我的代码中包含列表和字典,并且想知道我到底怎么把dict的键附加到列表上而又没有调用.keys()。事实证明,这就是方法。 我认为这两个陈述是等效的。即使忽略这一点,我也可以理解将字符串追加到列表的方式(因为字符串只是字符数组),但是

  • 问题内容: 这是我必须弄清楚怎么可能的代码。我有一个线索,但我不知道该怎么做。我认为这与负数和正数有关,也可能与变量修饰符有关。我是一个初学者,我到处都看过解决方案,但是找不到可用的东西。 问题是:您需要声明和初始化两个变量。如果条件必须为真。 代码: 感谢您抽出宝贵的时间。 问题答案: 这对于基本类型是不可能的。您可以使用带框的整数来实现: 在和比较将使用未装箱的值1,而将比较引用,并会成功,因

  • 问题内容: 我有以下矩阵sigma和sigmad: sigma: sigmad: 如果我尝试解决python中的广义特征值问题,则会获得: V: 如果我尝试在matlab中解决ge问题,我将获得: V: 但是d确实是巧合。 问题答案: 特征向量的任何(非零)标量倍数也将是特征向量。只有方向是有意义的,而不是整体规范化。不同的例程使用不同的约定- 通常您会看到幅度设置为1,或最大值设置为1或-1-某