我正在用Python编写一个空间交易游戏,并且我决定需要将地图分成较小的块,以减少在任何给定时间在屏幕上绘制时需要考虑的对象数量。
这通过具有一个Sector对象来处理,该对象的定义如下:
class Sector:
x=0 #Position of the sector. The galactic (absolute) position of any object is its in-sector position
y=0 #plus the galactic position offset times the size of a sector.
stardict=dict()
然后,生成器代码将75个星标填充在每个扇区中(此刻目前为100个扇区),并保留在stardict中。
thesector=Sector()
size=size/2
#Generate stars
for t in range(stars):
#name="Star "+str(t)
name=generate_name().capitalize()
thesector.stardict[name]=Star( name, (random.randint(-size,size), random.randint(-size,size)), (random.randint(0,255), random.randint(0,255), random.randint(0,255)), random.randint(3,7))
if math.floor((t/stars)*100)==(t/stars)*100: print("Generating stars: "+str((t/stars)*100)+"% done.")
但是,在尝试实际运行程序时会出现一些奇怪的错误,并且使用调试器打开它可以说明原因:每个扇区的stardict属性是相同的,它们每个都包含完全相同的星星(不是重复的,它们具有相同的内存地址)
。据我所知,每个Sector.stardict实际上都引用同一个dict对象。
我不知道为什么会这样。谁能对此有所启发?
他们指的是同一个对象。这是一个非常常见的陷阱。如果希望它们每个都有自己的dict
,则需要在__init__
方法中创建它。
class Sector:
x = 0 #Position of the sector. The galactic (absolute) position of any object is its in-sector position
y = 0 #plus the galactic position offset times the size of a sector.
def __init__(self):
self.stardict = dict()
就目前的代码而言,当您尝试stardict
通过进行访问时self.stardict
,python首先stardict
在 实例
上查找,但是当在 实例 中找不到stardict
属性时,它将在 class
上查找。它stardict
在类上找到,因此使用它。但是,这意味着所有实例都找到相同的对象stardict
(因为它们所有相同类的实例)-更新它们中的一个实例以及所有其他实例stardict
都知道(快于光速!)*。
*请注意,这不会破坏任何物理定律。由于它们是同一对象,因此信息传播没有距离…
目前,我有一个类分数,它允许我用三种不同的方式创建分数 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1 有2个整数,分子和分母 最后一种方法是解析一个字符串,该字符串必须与REGEX-?\d/[1-9]\d* gcd将尽可能减少生成的分数。 我现在想实现的是,具有相同分子和分母的分数实例具有相同的引用例如。 应该返回true。 我研究了一些关于泛型和边界的章节,但我不确定这是否是我
问题内容: 我正在尝试使用RSA 7.5和Websphere 7服务器开发IBM JAX_WS Web服务。因为我是一个初学者,所以我遵循Java类优先方法,即首先创建Java类,然后生成WSDL文件。 当我尝试创建wsdl文件时,出现异常: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.I
问题内容: 在C#中,您可以使用属性使数据字段可公开访问(允许用户直接访问它),但仍保留对那些直接访问的字段执行数据验证的功能。Java是否有类似的东西?对于实例,假设存在一个具有以下实现的C#类(请参见下文): 在该类中的此定义允许用户在从数据字段“ x”中检索值并为其分配值时“自然”使用数据字段“ x”。以下是它在main中的用法。 问题是… java也可以做到这一点吗?如果是这样,它叫什么?
假设您有2个包,并且有名为-Test的公共类。 第一个包。测试 第二包测试 它们中的每一个都有实例变量-x。 在第一种情况下-int x=2; 在第二种情况下-int x=3; 我想导入FirstPackage。在第二个包内测试。测试并打印值为2的x。 我的代码: 但是输出是3。如何打印?
我想建立一个本体模型,在那里我可以表示一个实体的缺失,可以这么说。例如,我希望有Rain和No_Rain,我将它们定义为不相交类。在此之后,我有了object属性has_rain。我想以某种方式能够推理出,对于同一个人来说,不可能同时拥有has_rain(雨)和has_rain(无雨)我已经搜索了很多,但是没有找到我问题的答案。也许我在什么地方错过了。对不起,如果我没有解释好一切,这是我的第一个问
更新2020-12-23 正如@slaw所说,这是kotlin编译器的行为,它是有效的,因为JVM使用地址而不是“签名”调用正确的方法。 我遇到了一种情况,似乎Kotlin允许子类创建与超类的getter相同的签名。 通常,函数具有相同的签名和不同的返回类型是不允许的。所以我对这种情况感到困惑。我不确定这是不是故意的。 如果我们看看反编译的Java代码,有两个方法具有相同的签名和不同的返回类型,这