GVKun编程网logo

dict.clear()与在Python中分配{}之间的区别(python dict clear)

21

如果您想了解dict.clear的相关知识,那么本文是一篇不可错过的文章,我们将对与在Python中分配{}之间的区别进行全面详尽的解释,并且为您提供关于dict和set之间的区别(python)、P

如果您想了解dict.clear的相关知识,那么本文是一篇不可错过的文章,我们将对与在Python中分配{}之间的区别进行全面详尽的解释,并且为您提供关于dict和set之间的区别(python)、Python 中 dict.clear() 和分配 {} 的区别、python 遍历迭代器iter()与list的区别、python中dir和__dict__之间的最大区别是什么的有价值的信息。

本文目录一览:

dict.clear()与在Python中分配{}之间的区别(python dict clear)

dict.clear()与在Python中分配{}之间的区别(python dict clear)

在python中,调用clear()和分配{}给字典之间有区别吗?如果是,那是什么?例:

d = {"stuff":"things"}d.clear()   #this wayd = {}      #vs this way

答案1

小编典典

如果您还有另一个变量也引用相同的字典,则有很大的不同:

>>> d = {"stuff": "things"}>>> d2 = d>>> d = {}>>> d2{''stuff'': ''things''}>>> d = {"stuff": "things"}>>> d2 = d>>> d.clear()>>> d2{}

这是因为分配d ={}会创建一个新的空字典并将其分配给d变量。这样就d2指向旧字典,里面还有项目。但是,d.clear()清除相同的字典,d并且d2两者都指向。

dict和set之间的区别(python)

dict和set之间的区别(python)

所以,我知道

a = {}  # dict

构造一个空字典。现在,我也意识到了这一点,

b = {1, 2, 3}  # set

创建一个集合。这很容易验证,因为

>>>print(type(a))<class ''dict''>>>>print(type(b))<class ''set''>

虽然我了解它的作用,但看不到 为什么
我们对集合和字典使用相同的语法。我试图在手册的setdict部分中找到有关此逻辑背后的更多信息,但可惜的是,我什么都没得到。

谁能向我解释为什么我们要这样做?是出于历史原因,还是我明显地遗漏了一些东西?

答案1

小编典典

Python 2中没有 固定的文字 ,历史上花括号仅用于字典。集可以从列表(或任何可迭代对象)中产生:

set([1, 2, 3])set([i for i in range(1, 3)])

Python
3引入了集合文字和理解(请参阅PEP-3100),这使我们能够避免中间列表:

{1, 2, 3}{i for i in range(1, 3)}

但是,由于向后兼容,空集形式保留给字典使用。在P3K中来自[Python-3000]集合的引用?状态:

我确信我们可以解决问题—我同意,
如果不是为了向后兼容,那么{}空集和{:}空dict是理想的。当我第一次写PEP时,我喜欢“特殊的空对象”的想法(即,{}可能变成集合或字典的东西),但是这里的一位指导者说服我,这只会导致新来者的困惑。思想(以及实施的痛苦)。

将以下信息更好地描述这些规则:

我认为Guido是最好的解决方案。使用set()空集时,用{} 空类型的字典,使用{genexp}了一套推导/显示器,使用
{1,2,3}显式集文字,和使用{k1:v1, k2:v2}的字典文字。如果需求超出需求,我们可以随时添加{/ }

Python 中 dict.clear() 和分配 {} 的区别

Python 中 dict.clear() 和分配 {} 的区别

clear()在python中,调用和分配{}给字典有区别吗?如果是,那是什么?例子:

d = {"stuff":"things"}
d.clear()   #this way
d = {}      #vs this way

python 遍历迭代器iter()与list的区别

python 遍历迭代器iter()与list的区别

  • 在遍历集合时,从逻辑上来说:
    使用iteration与list并没有什么区别,但是当集合的数据量比较大的时候,两者还是有区别的。

  • 从存储方式上说:
    list是以数组的形式存储数据,需要在内存中分配一块连续的空间,所以当集合的数据量比较大的时候可能分配不了足够的连续内存,这个时候最好是使用迭代器iteration保存数据

python中dir和__dict__之间的最大区别是什么

python中dir和__dict__之间的最大区别是什么

class C(object):    def f(self):        print self.__dict__        print dir(self)c = C()c.f()

输出:

{}[''__class__'', ''__delattr__'',''f'',....]

为什么自我中不存在“ f”。dict

答案1

小编典典

dir() 不仅仅是查找 __dict__

首先,dir()是一种API方法,它知道如何使用属性__dict__来查找对象的属性。

但是,并非所有对象都具有__dict__属性。例如,如果要向自定义类添加__slots__属性,则该类的实例将没有__dict__属性,但dir()仍可以列出这些实例上的可用属性:

>>> class Foo(object):...     __slots__ = (''bar'',)...     bar = ''spam''... >>> Foo().__dict__Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: ''Foo'' object has no attribute ''__dict__''>>> dir(Foo())[''__class__'', ''__delattr__'', ''__doc__'', ''__format__'', ''__getattribute__'', ''__hash__'', ''__init__'', ''__module__'', ''__new__'', ''__reduce__'', ''__reduce_ex__'', ''__repr__'', ''__setattr__'', ''__sizeof__'', ''__slots__'', ''__str__'', ''__subclasshook__'', ''bar'']

同样适用于许多内置类型。list没有__dict__属性,但是您仍然可以使用列出所有属性dir()

>>> [].__dict__Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: ''list'' object has no attribute ''__dict__''>>> dir([])[''__add__'', ''__class__'', ''__contains__'', ''__delattr__'', ''__delitem__'', ''__delslice__'', ''__doc__'', ''__eq__'', ''__format__'', ''__ge__'', ''__getattribute__'', ''__getitem__'', ''__getslice__'', ''__gt__'', ''__hash__'', ''__iadd__'', ''__imul__'', ''__init__'', ''__iter__'', ''__le__'', ''__len__'', ''__lt__'', ''__mul__'', ''__ne__'', ''__new__'', ''__reduce__'', ''__reduce_ex__'', ''__repr__'', ''__reversed__'', ''__rmul__'', ''__setattr__'', ''__setitem__'', ''__setslice__'', ''__sizeof__'', ''__str__'', ''__subclasshook__'', ''append'', ''count'', ''extend'', ''index'', ''insert'', ''pop'', ''remove'', ''reverse'', ''sort'']

dir()实例有什么用

Python实例具有自己的__dict__,但它们的类也有:

>>> class Foo(object):...     bar = ''spam''... >>> Foo().__dict__{}>>> Foo.__dict__.items()[(''__dict__'', <attribute ''__dict__'' of ''Foo'' objects>), (''__weakref__'', <attribute ''__weakref__'' of ''Foo'' objects>), (''__module__'', ''__main__''), (''bar'', ''spam''), (''__doc__'', None)]

dir()方法使用 两种 这些__dict__属性, 并且 一来就object上创建实例,类可用属性的完整列表,并在类的所有祖先。

在类上设置属性时,实例也会看到以下内容:

>>> f = Foo()>>> f.hamTraceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: ''Foo'' object has no attribute ''ham''>>> Foo.ham = ''eggs''>>> f.ham''eggs''

因为该属性已添加到类中__dict__

>>> Foo.__dict__[''ham'']''eggs''>>> f.__dict__{}

注意实例如何__dict__留空。在Python对象上进行属性查找遵循对象的层次结构,从实例到类型,再到父类,以搜索属性。

仅当直接在实例上设置属性时,您才可以在实例保持不变__dict__的情况下看到反映在实例中的属性__dict__

>>> f.stack = ''overflow''>>> f.__dict__{''stack'': ''overflow''}>>> ''stack'' in Foo.__dict__False

TLDR;或摘要

dir()不仅查找对象__dict__(有时甚至不存在),它还将使用对象的遗产(其类或类型,以及该类或类型的任何超类或父级)为您提供完整的图像所有可用的属性。

实例__dict__只是该实例上的“本地”属性集,并不包含该实例上可用的每个属性。相反,您还需要查看类和类的继承树。

今天关于dict.clear与在Python中分配{}之间的区别的介绍到此结束,谢谢您的阅读,有关dict和set之间的区别(python)、Python 中 dict.clear() 和分配 {} 的区别、python 遍历迭代器iter()与list的区别、python中dir和__dict__之间的最大区别是什么等更多相关知识的信息可以在本站进行查询。

本文标签: