最近,我发现串联列表时出现不一致。
因此,如果我使用+运算符,它不会将list与不同类型的任何对象连接在一起。例如,
l = [1,2,3]
l = l + (4,5) #TypeError: can only concatenate list (not "tuple") to list
Run Code Online (Sandbox Code Playgroud)
但是,如果使用+ =运算符,它将忽略对象的类型。例如,
l = [1,2,3]
l += "he" #Here, l becomes [1, 2, 3,"h", "e"]
l += (56, 67) #Here, l becomes [1, 2, 3,"h", "e", 56, 67]
Run Code Online (Sandbox Code Playgroud)
那么,这仅仅是语言的语义还是其他原因?
在下面的代码中,我试图解压缩一个 zip 对象。
x = [1, 2, 3]; y = ['a', 'b', 'c']
z = zip(x, y)
#print(list(z)) #2nd print statement returns [] if this line is uncommented
unzip = zip(*z)
print(list(unzip)) #returns [(1, 2, 3), ('a', 'b', 'c')]
Run Code Online (Sandbox Code Playgroud)
如果我保持代码不变,它就可以正常工作。但是在取消注释第一个打印语句时,第二个打印语句返回一个空列表而不是返回解压缩的列表对象。为什么?
以下代码按排序顺序列出了名为“A”的类的属性:-
>>> class A():
def __init__(self, i):
self.at = i
>>> sorted(vars(A))
['__dict__', '__doc__', '__init__', '__module__', '__weakref__']
Run Code Online (Sandbox Code Playgroud)
现在,打印键的值,'__dict__'结果如下:-
>>> vars(A)['__dict__'] #Value of '__dict__'
<attribute '__dict__' of 'A' objects>
Run Code Online (Sandbox Code Playgroud)
根据文档, vars([object])
返回具有
__dict__属性的模块、类、实例或任何其他对象的__dict__属性。
我不明白的是,'__dict__'列表中的属性是用于vars()返回属性的相同属性,A还是具有其他目标的不同属性,例如按照建议(根据我的说法)实现 A 的对象命名空间的值其中成立。'__dict__'
编辑:-
问题的第一部分与另一个问题(也由@eliotness 提到)非常相关,但这是第二部分(如下所述),我找不到任何答案或相关问题,因此,更改标题题。
让我们考虑另一个在 Python 中生成最终基类属性列表的代码object:-
>>> sorted(vars(object))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', ...., '__str__', '__subclasshook__']
>>> hasattr(object, '__dict__')
True …Run Code Online (Sandbox Code Playgroud)