我是python的新手(但不是一般编程人员),并且真的不了解列表的内容。我在一个文本文件中有成千上万个测试集,每个测试集是256(可以是不同的)x,y点。我要做的是将测试集中的每个点存储到一个列表中,然后将每个列表存储在另一个列表中,从而有效地创建2D列表。我尝试过的三个选项中的两个是无错误的,但是我不知道不同的选项是什么意思,也不知道为什么我应该选择一个。 这与"Least Astonishment" and the Mutable Default Argument不同,因为它不能解释其中的哪个是列表以及其他的定义。
foo= list
foo.append(1)#TypeError: descriptor 'append' requires a 'list' object but received a 'int'
bar= []
bar.append(1)#no error
baz= list()
baz.append(1)#no error
答案 0 :(得分:4)
第一个将foo
设置为对象list
。正如您所发现的,这不是一个空列表。对象list
是内置类型...,现在您具有该类型的作用域内别名。您不能追加类型;因此出现错误消息。
另外两种是将变量初始化为空列表的经典方法。中间一个使用列表文字表示法构造一个列表,而最后一个使用list
类型对象作为函数来生成该类型的实例。
答案 1 :(得分:2)
执行foo = list
时,实际上是将foo
分配给list的内置python对象。 bar = list()
和baz = []
都启动两个新变量作为新的空缺列表。但是在python var_ = []
中,分配要比var_ = list()
快一点。
答案 2 :(得分:0)
这是因为foo = list
使foo
成为list
类型的别名。该行中没有实例化实际的list
对象。但是,如果您有list
对象,则可以可以使用list.append()
(或foo.append()
)来附加到该对象。
像这样:
foo = list
bar = [1]
list.append(bar, 2)
# bar is now [1, 2]
foo.append(bar, 3)
# bar is now [1, 2, 3]
由于示例代码仅使用一个参数(一个int)调用foo.append()
,因此该异常抱怨它需要一个list
而不是一个int
。
注意:这不是列表类的特殊功能。可以两种形式调用所有实例方法:some_object.func(a, b, c)
或SomeType.func(some_object, a, b, c)