python - 没有指针的字典会发生什么

标签 python python-3.x dictionary

我对 dict() 有一个想法,我会不断更新它,就像这样:

def creating_new_dict():
   MyDict = dict()
   #... rest of code - get data to MyDict
   return MyDict

def main():
    while(1):
        MyDict = creating_new_dict()
        time.sleep(20)

我知道 MyDict 是指向 dict 的指针,所以我的问题是 MyDict 中的旧数据会怎样? 它是被删除了还是我应该确保它已经消失了?

最佳答案

回来回答你的问题,因为没有其他人做过:

I know that MyDict is a pointer to the dict

呃。 MyDict 是对您的 dict 对象的引用,而不是指针。稍微题外话如下:


您不能在函数内改变不可变类型,因为您处理的是引用,而不是指针。见:

def adder(x):
    x = x + 1

a = 0
adder(a)
a
Out[4]: 0

我不会在兔子洞里走得太远,但就是这样:我无法将任何东西放入 adder 的主体中,这会导致 a改变。因为变量是引用,而不是指针。


好的,我们回来了。

so My question is what happens to the old data in MyDict?

嗯,它仍然存在,在某个对象的某个地方,但你炸毁了对它的引用。引用不再存在,它已经不存在了。事实上,对旧 dict 的现存引用恰好为零,这在下一段中很重要!

Is it deleted

本身并没有被删除,但您基本上可以认为它已被删除。它没有剩余的引用,这意味着它符合垃圾收集的条件。 Python 的 gc 在被触发时会出现并清除所有没有剩余引用的对象,其中包括所有孤立的 dict

但正如我在评论中所说:gc 不会在现在触发,但会在(可能非常接近的) future 某个时间触发。多快发生取决于.. 东西,包括你运行的是什么风格的 python。 cPython(您可能正在运行的那个)通常会立即 gc 对象,但是这不能保证并且不应依赖 - 它留给实现。您可以指望的是 - gc 会出现并最终清理(好吧,只要您没有禁用它)

or should I make sure it's gone?

不不不。没有。不要做垃圾收集器的工作。仅当您有非常具体的性能原因时才应该这样做。

I still don't believe you, show me an example.

呃,你是这么说的吧?好的:

class DeleteMe:
    def __del__(self): #called when the object is destroyed, i.e. gc'd
        print(':(')

d = DeleteMe() 
d = DeleteMe() # first one will be garbage collected, leading to sad face
:(

而且,正如我之前所说,您不应该指望 :( 立即发生,只是 gc 最终会发生。

关于python - 没有指针的字典会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19829740/

相关文章:

python - 在 Fabric 中移动隐藏文件

python - 按一列中出现的频率对整个 csv 进行排序,并仅显示实例的一个副本

java - 为 SonarPython 编写一个插件

c++ - boost::任何带有 char[] 的 map

python - 如何在 python 中将 ":"之类的字符转换为 ":"?

python - 如何根据数组的两个日期添加列值?

自定义鸭子类型(duck typing)的 Python 类型注释

python - 搜索电子邮件并打开取消订阅链接

java - 在 Java 中将流转换为字符串

java - 处理 2 个 map 中的数据以创建第 3 个 map