py3.x中list()和[]的实现有什么区别?

时间:2017-12-21 13:02:40

标签: python python-3.x list

以下是示例代码1及其结果。

d ={
    "name":"looser",
    "roll":6666,
    "profile" : "developer"
}

print("list formatted dict is {}".format([d]))

for k,v in [d.items()]:
    if d[k] is "developer":
        d.pop(k)
    else:
        print(k)

结果:

list formatted dict is [{'name': 'looser', 'roll': 6666, 'profile': 'developer'}]
Traceback (most recent call last):
  File "/Users/rough/try.py", line 18, in <module>
    for k,v in [d.items()]:
ValueError: too many values to unpack (expected 2)

Process finished with exit code 1

以下是修改后的代码示例代码。

d ={
    "name":"looser",
    "roll":6666,
    "profile" : "developer"
}

print("list formatted dict is {}".format([d]))

for k,v in list(d.items()):
    if d[k] is "developer":
        d.pop(k)
    else:
        print(k)

结果:

list formatted dict is [{'name': 'looser', 'roll': 6666, 'profile': 'developer'}]
name
roll

Process finished with exit code 0

在许多地方,人们告诉我没有区别,是否真的没有区别。如果没有区别那么为什么会有这样的结果。

因为一个人正在解决我的问题 ** RuntimeError:字典在迭代期间改变了大小**

2 个答案:

答案 0 :(得分:4)

几乎没有区别:

a = list()

a = []

除了名称查找与内置[]Why is [] faster than list()?

所用的时间

但如果您将任何项目传递给list,则list会尝试迭代以构建新列表。

来自help(list)输出:

  

班级列表(对象)

     

| list() - &gt;新的空列表

     

| list(iterable) - &gt;从iterable的项目初始化的新列表

创建list对象时有2个“模式”。

尝试list(3)您将收到TypeError: 'int' object is not iterable错误,请尝试[3]您将获得一个包含1个元素的列表。

传递d.items()对象时没有什么不同。

  • list(d.items())将项目迭代/转换为元组列表。
  • [d.items()]创建一个包含单个元素的列表:d.items()(这解释了解压缩到2个元素失败)

另请注意,除非您想要在字典上进行迭代时删除字典,否则不需要for k,v in list(d.items()):(这似乎是您遇到的问题,看到您最近的编辑)

除了这种情况之外,不需要转向列表,因为d.items()已经可以迭代,并且将它包装在列表中没有任何用处(而且它甚至更慢)

答案 1 :(得分:1)

[]是一个文字,它将完全按照您的定义创建列表。 ['a']是包含一个项目的列表。 [d.items()]也是一个包含一个项目的列表。这一项是很多项目,但无法解压缩只是k, v

list()是构造函数表单,它使用可迭代来创建新列表。 list('a')等于['a']list('ab')等于['a', 'b'];它遍历可迭代字符串'ab'list(d.items())遍历d.items()中的所有项目并创建列表[('name', 'looser'), (...)];这是一个包含许多两项元组的列表,它们分别解压缩到k, v