相关疑难解决方法(0)

管理面向对象游戏中的项目

每隔一段时间我就会想要从我的其他项目中休息一下,尝试将经典冒险基于文本的游戏(在Python中,这次)作为一个有趣的项目,但我总是有实现项目系统的设计问题.

我希望游戏中的项目从一个基Item类下降,包含每个项目具有的一些属性,例如损坏和重量.当我尝试为这些项添加一些功能时,我的问题开始了.当物品的伤害超过阈值时,它应该被摧毁.我的问题就在于:我真的不知道如何实现这一目标.

由于del self不会为一百万个不同的原因,工作(:我故意提供使用"删除"作为我知道错了东西,我知道垃圾收集是什么,以及它是如何不是我想要的.编辑)如何我应该这样做(和其他类似的任务)?每个项目是否应该包含某种对它的容器的引用(我猜这个玩家)并且"要求"自己被删除?

首先想到的是一个包含游戏中每个项目的大字典,每个对象都会引用这个列表,并且都拥有并知道它自己的唯一ID.我根本不喜欢这个解决方案,我认为这不是正确的方法.有人有什么建议吗?

编辑:我看到很多人都认为我担心垃圾收集.我所说的不是垃圾收集,而是从游戏玩法中删除对象.我不确定应该启动哪些对象去除等.

python oop

5
推荐指数
1
解决办法
1580
查看次数

为什么 PIL 打开某些 png 文件后不释放内存?

假设我有一项从网络获取图像并将其保存到目录的服务。我以 .png 文件形式获取输入并将其保存在本地。我使用 PIL 打开图像,并根据需要为其添加背景。我最近注意到处理某些 .png 文件时内存使用率很高。似乎当打开某些 .png 时,PIL 没有正确释放内存。

以下代码将演示会发生什么:

from PIL import Image
import resource

def check_mem(filename):
    mem = lambda:resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
    print mem()
    img = Image.open(filename)
    print mem()
    img = img.convert('RGBA')
    print mem()
    background = Image.new("RGBA", img.size, (255, 255, 255))
    print mem()
    image = background.paste(img, img)
    print mem()
    del background
    del img
    del image
    print mem()

if __name__ == "__main__":
    import sys
    check_mem(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)

对于某些图像(例如像这样的图像),这会生成以下输出:

12416
12416
22508
22508
22508
22508
Run Code Online (Sandbox Code Playgroud)

您可以看到使用的内存几乎增加了一倍!即使最后我删除了所有对象,内存仍然是开始时的两倍。

对于其他图像,例如这一张内存使用情况不会改变:

12416
12416
12416 …
Run Code Online (Sandbox Code Playgroud)

python png image python-imaging-library

5
推荐指数
0
解决办法
2023
查看次数

如何修复str的重新定义?

尝试使用Python解释器,我无意中分配了一个字符串,str如下所示:

str = 'whatever'
Run Code Online (Sandbox Code Playgroud)

后来在同一场会议上,我打电话给另一个声明str(),说......

double_whatever = str(2) + ' * whatever'
Run Code Online (Sandbox Code Playgroud)

...,并得到错误TypeError: 'str' object is not callable(而不是预期的输出'2 * whatever').一个相关的SO答案帮助我快速看到了我犯的错误.

但是,我仍然不清楚如何str()在受影响的会话中修复呼叫.当然我可以退出Python解释器并启动另一个会话,但我很好奇如何避免这种情况.

到目前为止,我已确认......

double_whatever = __builtins__.str(2) + ' * whatever'  # => '2 * whatever'
Run Code Online (Sandbox Code Playgroud)

...仍然像我想要的那样工作; 但我不清楚如何回到不需要__builtins__.资格.

如何修复我无意识的重新定义,str以便我str()在Python-interpreter会话中的调用再次起作用?

python string

4
推荐指数
1
解决办法
498
查看次数

使用np.load后关闭文件(使用Spyder)

我正在加载一个文件:

a= np.load('myfile.npz')
Run Code Online (Sandbox Code Playgroud)

然后做事 a

过了一会儿,我重新生成myfile.npz(在远程机器上).

当我尝试从远程计算机复制文件(使用WinSCP)时,它失败,报告:

System Error.  Code: 32.
The process cannot access the file because it is being used by another process.
Run Code Online (Sandbox Code Playgroud)

我试过这个:

>>> a.fid
<open file 'myfile.npz', mode 'rb' at 0x058A78B8>
>>> a.fid.close()
>>> a.fid
<closed file 'myfile.npz', mode 'rb' at 0x058A78B8>
Run Code Online (Sandbox Code Playgroud)

但是,文件复制仍然失败.

如果我关闭python解释器,副本成功.

造成这个问题的原因是什么?我需要先关闭myfile.npz(我以为这是自动处理的)吗?如果是这样,我该怎么办?

我在Win7上的Spyder IDE中使用了一个python控制台.

python file-io numpy winscp spyder

2
推荐指数
1
解决办法
2806
查看次数

使用Python删除内存中的对象

我正在尝试这种方法来删除 python 中的对象。我阅读了 Python 的文档,指出垃圾收集器将自动删除未引用的对象。

def check():
    class newOb():
        def __init__(self,value):
            self.value = value
            print self.value
            return None

    class ob:
        ins = {}
        def cr(self,someuniqueid,value) :
            newV = newOb(value)
            ob.ins[someuniqueid] = newV ## saving this object refernce to the ob class ins dictionary
            return newV

    #### Accessing Object ###
    someuniqueid  = 12
    c = ob()
    d = c.cr(someuniqueid,123)
    print d.value ## will print 123
    # now deleting the associated object
    del c.ins[someuniqueid]

check()
Run Code Online (Sandbox Code Playgroud)

在最后一步,我从内存中删除对象引用正在使用上述过程将从内存中删除对象

如果不是,那么代码有什么问题以及如何纠正它

python

2
推荐指数
2
解决办法
2万
查看次数

在 Swift 中删除类的实例

如何在 Swift 中删除类的实例?寻找某种相当于

del instance
Run Code Online (Sandbox Code Playgroud)

在Python中。我对 Swift 还很陌生,在文档或之前的帖子中找不到任何内容。

我在游戏中有一个子弹类,在与玩家碰撞后需要将其删除。示例代码可以是这样的

class Bullet() {
    init() {
        for traveled in 0...range {
            //travel forward
            if collided {
                //damage collided player
                del self
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这就是为我清理的内容http://www.apeth.com/iOSBook/ch12.html#_memory_management

swift

2
推荐指数
1
解决办法
9146
查看次数

为什么要删除__init__.py中的模块?

我正在对PyTorch源代码进行一些研究。作者实际上在该文件中删除了模块。

from .adadelta import Adadelta  # noqa: F401
from .adagrad import Adagrad  # noqa: F401
from .adam import Adam  # noqa: F401

del adadelta
del adagrad
del adam
Run Code Online (Sandbox Code Playgroud)

这样做的理由是什么?

python python-import

1
推荐指数
1
解决办法
76
查看次数