我已经开始了解用于对象序列化和反序列化的 pickle 模块。
我知道它pickle.dump用于将代码存储为字节流(序列化),pickle.load本质上是相反的,将字节流转回Python对象。(反序列化)。
但什么是pickle.dumps和,它们pickle.loads之间有什么区别?我查看了文档,但我无法区分两者。pickle.dumppickle.load
从文档中:
pickle.dumps(obj,protocol=None,*,fix_imports=True,buffer_callback=None); 将对象 obj 的 pickle 表示形式返回为字节对象,而不是将其写入文件。
pickle.loads(data,/,*,fix_imports = True,encoding =“ASCII”,errors =“strict”,buffers = None)返回对象的腌制表示数据的重构对象层次结构。数据必须是类似字节的对象。
在过去的几天里,我一直在使用Python 的 Ursina 引擎,用于创建 3D 和 2D 游戏。但我在制作 3D 游戏时使用该引擎经常遇到的问题是无法正确关闭窗口。发生这种情况是因为在游戏内部使用鼠标来控制玩家,所以如果我尝试转到关闭按钮,鼠标将始终留在游戏中。解决方法是移动到另一个窗口,将鼠标定位在窗口之外,然后最后单击关闭按钮。但这对于用户来说需要做很多工作,只是简单地关闭窗口。
下面是一些简单的代码来演示:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
import random
game = Ursina()
class Block(Button):
def __init__(self, position = (0,0,0)):
super().__init__(parent = scene, position = position, model = 'cube', color = color.white)
for z in range(20):
for x in range(20):
block = Block(position = (x, 0, z))
player = FirstPersonController()
game.run()
Run Code Online (Sandbox Code Playgroud)
我相信这个 import 语句导致了这个:
from ursina.prefabs.first_person_controller import FirstPersonController
如何在 Ursina 中正确关闭窗口?
举一个示例程序:
c = 10
def myfunc():
print(c)
myfunc()
Run Code Online (Sandbox Code Playgroud)
这按预期打印 10,但如果我们看另一个程序:
c = 10
def myfunc():
print(c)
c = 1
myfunc()
Run Code Online (Sandbox Code Playgroud)
它说:local variable 'c' referenced before assignment
在这里,如果 python 解释器实际上是逐行运行的,那么它不应该10在到达下一行之前打印以得出存在局部变量的结论吗?
Python 有词法分析器、分词器和解析器。它是否会遍历所有代码,在逐行执行之前对其进行解析?
这就是为什么它能够说函数下面有一个局部变量吗?