每隔一段时间我就会想要从我的其他项目中休息一下,尝试将经典冒险基于文本的游戏(在Python中,这次)作为一个有趣的项目,但我总是有实现项目系统的设计问题.
我希望游戏中的项目从一个基Item类下降,包含每个项目具有的一些属性,例如损坏和重量.当我尝试为这些项添加一些功能时,我的问题开始了.当物品的伤害超过阈值时,它应该被摧毁.我的问题就在于:我真的不知道如何实现这一目标.
由于del self不会为一百万个不同的原因,工作(:我故意提供使用"删除"作为我知道错了东西,我知道垃圾收集是什么,以及它是如何不是我想要的.编辑)如何我应该这样做(和其他类似的任务)?每个项目是否应该包含某种对它的容器的引用(我猜这个玩家)并且"要求"自己被删除?
首先想到的是一个包含游戏中每个项目的大字典,每个对象都会引用这个列表,并且都拥有并知道它自己的唯一ID.我根本不喜欢这个解决方案,我认为这不是正确的方法.有人有什么建议吗?
编辑:我看到很多人都认为我担心垃圾收集.我所说的不是垃圾收集,而是从游戏玩法中删除对象.我不确定应该启动哪些对象去除等.
假设我有一项从网络获取图像并将其保存到目录的服务。我以 .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解释器,我无意中分配了一个字符串,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会话中的调用再次起作用?
我正在加载一个文件:
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 中的对象。我阅读了 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)
在最后一步,我从内存中删除对象引用正在使用上述过程将从内存中删除对象
如果不是,那么代码有什么问题以及如何纠正它
如何在 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
我正在对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)
这样做的理由是什么?