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

列表扩展了奇怪的行为

孙昂然
2023-03-14
问题内容

在Python(2.7)中发现了从未有过的有趣的东西。

这个:

a = []
a += "a"

确实有效,结果是:

>>> a
>>> ["a"]

a = []
a = a + "a"

>>> TypeError: can only concatenate list (not "str") to list

有人可以解释为什么吗?感谢您的回答。


问题答案:

Python区分++=运算符,并为它们提供了单独的挂钩。__add____iadd__。该list()类型只是为后者提供了不同的实现。

列表分别实现这些功能更为有效;__add__必须返回一个全新的列表,而__iadd__可以扩展self然后返回self

在C代码中,__iadd__是由所实现的list_inplace_concat(),该只需调用listextend(),或者在python代码中,由[].extend()。后者根据设计可以采用
任何 顺序。

__add__另一方面,用C表示的方法list_concat仅将alist作为输入,可能是出于效率考虑。它可以直接在内部C数组上循环,并将项目复制到新列表中。

总之,__iadd__接受任何顺序的原因是因为在实施PEP
203
(增强添加提案)时,对于列表而言,重用该.extend()方法最简单。



 类似资料:
  • 问题内容: 我不了解python中列表的行为: 为什么一个元素的分配影响另一个元素?感谢您的回答! 问题答案: 当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。 用ASCII术语来说: 您可以清楚地看到更改list3将同时影响两个位置。 如果要创建可变长列表而不复制引用,则应执行以下操作: 在这里,我们使用列表理

  • 我有一个XUIView课程,如下所示。运行动画时,对折叠没有效果。 谁能解释我? 源代码:http://www.mediafire.com/file/n6svp1mk44fc0uf/TestXUIView.zip/file

  • 我使用的是JPA2.1和Hibernate5.0.1实现。 我将ManyToOne关系的FetchType更改为Lazy,所以它就爆炸了。 当我试图查找子对象的所有记录时:最后一条记录带有所有空字段和一个handler=javassistlazyInitializer。这种奇怪的行为会影响使用该对象的字段(如h:OneSelectMenu)。 }

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 在JSX中使用spread操作符react处理之类的对象似乎无法输出我所期望的结果。 似乎被渲染为,其中应该是,如本文所述。我在任何地方都找不到这个文件。我对react完全是新手,我试图理解它的语法,想知道react是否在内部做了类似这样的未记录的事情。 一个简单的测试突显了我的困惑: 警报了 1. 这肯定不会编译:

  • 问题内容: 我有一些面板内的组合框: 在我将项目更新到.NET 4之前还可以,在将项目(和AJAX)更新到.net4之后,这看起来真的很奇怪……我无法解释正确,我将显示: 我该如何解决?:)完整的CSS / ASPX页面在这里-> https://github.com/nCdy/Issues/tree/master/Ajax%20ComboBox(字符串#287) 问题答案: 我有一个类似的问题,