Mav*_*ckD 10 python namedtuple
我理解为什么tuple包含可变对象的list内容不可清除,因为list元组中的项仍然可以更新.
例:
# hashable
tuple_test = (1,2,3)
print(tuple_test.__hash__())
Run Code Online (Sandbox Code Playgroud)
虽然这不是可以清洗的:
# Not hashable
tuple_test2 = (1,2, [1,2])
print(tuple_test2.__hash__())
Run Code Online (Sandbox Code Playgroud)
以上对我有意义.
但是,当我创建一个namedtuple带有list项目时,它仍然可以清洗:
# hashable
named_tuple = namedtuple("TestTuple", 'name age')
Run Code Online (Sandbox Code Playgroud)
当我添加一个list:
# still hashable
named_tuple = namedtuple("TestTuple", ["name", "age"])
print(named_tuple(name="adam", age=20).__hash__())
Run Code Online (Sandbox Code Playgroud)
为什么元组和命名元组之间存在这种差异?
但是当我创建一个带有列表作为项目的命名元组时,它仍然可以清除......
你永远不会那样做.您创建一个名为元组用str,'adam'和int,20
下列:
named_tuple = namedtuple("TestTuple", 'name age')
Run Code Online (Sandbox Code Playgroud)
和
named_tuple = namedtuple("TestTuple", ["name", "age"])
Run Code Online (Sandbox Code Playgroud)
不要创建对象,而是namedtuple创建namedtuple 类.根据文件:
返回名为typename的新元组子类.
换句话说,collections.namedtuple是一个返回类的工厂函数.如果您创建这些类的实例,则它们的实例遵循与常规tuple实例相同的规则.
所以考虑:
>>> from collections import namedtuple
>>> TestTuple = namedtuple('TestTuple', ['name', 'age'])
>>> type(TestTuple)
<class 'type'>
>>> class A: pass
...
>>> type(A)
<class 'type'>
Run Code Online (Sandbox Code Playgroud)
TestTuple是namedtuple工厂函数的返回值,它不是一个namedtuple实例,它是type所有其他类的实例.
创建此类的实例时:
>>> test_tuple = TestTuple('adam',32)
>>> type(test_tuple)
<class '__main__.TestTuple'>
Run Code Online (Sandbox Code Playgroud)
它们遵循常规tuple对象通常的可执行性规则:
>>> hash(test_tuple)
5589201399616687819
>>> test_tuple = TestTuple('adam', [32, 31])
>>> hash(test_tuple)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
注意,fieldnames参数接受字段名的序列(例如列表),或者为方便起见,接受以空格/逗号分隔的字段名字符串,以及文档中的字符串:
... field_names是一系列字符串,例如['x','y'].或者,field_names可以是单个字符串,每个字段名由空格和/或逗号分隔,例如'xy'或'x,y'.
| 归档时间: |
|
| 查看次数: |
883 次 |
| 最近记录: |