编辑: 我在原始示例中粗心大意。该行为不是在我A
向自身添加列表时发生的,而是在我向自身添加 包含
列表的列表时A
发生的A
。请参阅下面的更正示例。
我试图理解省略号列表(那些[...]
在您具有列表引用本身时出现并出现的列表)在Python 2中的工作方式。
我特别想知道为什么,如果A
是list
,A = 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 + b
和a += 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个元素,另一个返回多个元素。我的目标是在不阻塞的情况下将它们合并在一起,以构建如下对象: 我试过压缩、合并和合并,但似乎都不是解决方案。