【问题标题】:Two Different Objects Created Using A Class Share The Same Memory使用一个类创建的两个不同对象共享相同的内存
【发布时间】:2019-10-05 12:49:28
【问题描述】:

我正在编写一个 Python 脚本,运行一个从类中实例化对象的函数。运行此函数两​​次(假设创建两个对象)会创建两个指向同一内存位置的变量,实际上使我只有一个对象。如果对象的属性两次都相同,这是可以理解的,但事实并非如此。这意味着第一个实例化的属性会被第二个实例化覆盖。

我已尝试制作深层副本以纠正此问题。

x = deepcopy(create_my_object(123))
y = deepcopy(create_my_object('abc')) 

x 和 y 仍然指向同一个内存位置。这意味着对象 x 的属性“123”被“abc”覆盖。我想要两个具有这些属性的对象。

类:

class Sq:
    def __init__(self, source, queries):
        Sq.datetime_created = datetime.datetime.now()
        Sq.source = source
        Sq.queries = queries
        Sq.count = len(queries)
        Sq.filtered = False 

总而言之,用不同的 args 集调用这个类不会在不同的位置创建对象,我只是最终得到一个具有最近实例化属性的对象。

提前致谢 - 我和我的同龄人都被难住了!

编辑:创建对象的函数如下所示:

def news(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    result = soup.find_all(class_='top-story__title')
    return Sq(url, result)

【问题讨论】:

  • 1) create_my_object 函数是什么样的?希望这个内容可以帮助你:geeksforgeeks.org/copy-python-deep-copy-shallow-copy
  • 谢谢@Eric。我知道没有正确复制东西,但我认为情况并非如此。我已将该功能添加到原始帖子中。调用该函数以创建具有不同“url”参数的类不会在不同的内存区域中创建对象,从而导致旧的不同对象被覆盖:(

标签: python object memory


【解决方案1】:

Sq.__init__ 方法中,您正在设置 变量的值,而不是实例变量。这些值由类的所有实例共享,并且在其中任何一个实例中发生更改时都会在所有实例中被覆盖。有关类与实例变量的描述,请参阅 here

将每一行更改为,例如,self.datetime_created = datetime.datetime.now() 等。

【讨论】:

  • 我没有遇到类变量和实例变量,但这就是答案。我喜欢学习新的 Python 知识!谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多