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

省略号列表[…]并将列表与其自身连接

杜阳炎
2023-03-14
问题内容

编辑: 我在原始示例中粗心大意。该行为不是在我A向自身添加列表时发生的,而是在我向自身添加 包含
列表的列表时A发生的A。请参阅下面的更正示例。

我试图理解省略号列表(那些[...]在您具有列表引用本身时出现并出现的列表)在Python 2中的工作方式。

我特别想知道为什么,如果AlistA = A + A似乎不同的工作A += A(和A.append(A))。

也就是说,为什么会得到:

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

>>> a = [1, 2]  
>>> a += [a]
>>> a
[1, 2, [...]]

(请注意,这a.append(a)似乎对我很有效,就像后者一样。)

如果它有助于弄清楚事情,那么也将不胜感激有关此省略号列表现象的任何其他更一般的信息。


问题答案:

编辑:( 以解决您对问题的编辑引起的其他问题):

a = a + ba += b不一样的操作。前者执行a.__add__(b),后者执行a.__iadd__(b)(“就地添加”)。

两者之间的区别在于,前者始终创建一个新对象(并将名称a重新绑定到该新对象),而后者则就地修改该对象(如果可以,并且可以使用列表,则可以)。

为了说明这一点,只需查看对象的地址即可:

>>> a = [1, 2]
>>> id(a)
34660104
>>> a = a + [a]
>>> id(a)
34657224
>>> id(a[2])
34660104

“新”a是从头开始构造的,首先从旧列表中获取值a,然后将对旧对象的引用连接到该列表。

与此相比:

>>> a = [1, 2]
>>> id(a)
34658632
>>> a += [a]
>>> id(a)
34658632
>>> id(a[2])
34658632

(旧答案,解释循环引用):

考虑一下:

>>> a = [1, 2]; a += a
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a.extend(a)
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a += [a]
>>> a
[1, 2, [...]]
>>> a = [1, 2]; a.append(a)
>>> a
[1, 2, [...]]

因此,总结一下第一部分:

对于列表,a += a相当于调用就地a.extend(a)修改a,并添加在a此操作开始时找到的元素的副本。

相反地,a += [a]对应于a.append(a),两者都创建对列表的引用a(即,一个指向在其存储器地址),并添加
到列表中。构成所谓的“循环参考”。

如果您要查看此时的内部表示a,它将看起来像这样:

a:    Reference to a list object at address 0xDEADBEEF
a[0]: Reference to the integer object "1"
a[1]: Reference to the integer object "2"
a[2]: Reference to the same list object at address 0xDEADBEEF

旧的Python版本(1.5.1之前的版本)不够聪明,无法检测到它,因此,如果执行a print a,则会[1, 2, [1, 2, [1, 2, [1, 2, [1, 2, [1, 2, ...在无限循环中得到等等。从Python 1.5.1开始,解释器会检测到此情况,[1, 2, [...]]而是打印出来。



 类似资料:
  • 我想创建一个符合JSON proto3的字符串,包括以下部分: 我不知道怎么做。这似乎是一个列表 我只尝试了“Newtonsoft Json. NET”,但这个问题对任何其他JSON库或自定义编码方法都是开放的。如何做到这一点? 编辑:这是一个序列化问题。我无法控制反序列化程序代码。

  • 问题内容: 我在玩python。我在IDLE中使用了以下代码: 输出为: 这是[…]什么 有趣的是,我现在可以将其用作无穷大列表的列表,即 我可以根据需要编写以上内容,并且仍然可以使用。 编辑: 它在内存中如何表示? 有什么用?一些有用的例子将很有帮助。 官方文档的任何链接将非常有用。 问题答案: 这意味着你创建了一个嵌套在其内部的无限列表,该列表无法打印。包含p其中包含,依此类推。这种记法是一种

  • 问题内容: 当我搜索“ new1”时,如何获取所有用户名。例如:我应该以tblC中的userid 1,2为A和B来获取具有new1的row1的1,2,应该使用什么查询来获得上述结果?非常感谢您的帮助。 http://sqlfiddle.com/#!2/1ab8e/2 到目前为止查询: 问题答案: 您应该真正看一下 数据库的规范化 ,首先通过添加一个联结表并保持来自tablec的关系来规范化您的结构

  • ...但我得到: 我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),所以MapStruct知道如何像这样映射列表类型的每个字段: ...但我收到错误消息

  • 问题内容: 可以与列表一起使用吗? 就像我有带有mimetypes的属性文件,而在我的班级文件中,我有类似的东西 问题答案: Spring 4支持自动收集给定类型的所有bean并将其注入到集合或数组中的能力。 例:

  • 我有两个可观测值,一个返回1个元素,另一个返回多个元素。我的目标是在不阻塞的情况下将它们合并在一起,以构建如下对象: 我试过压缩、合并和合并,但似乎都不是解决方案。