Godot 4 数组追加也会更改所有现有记录

问题描述 投票:0回答:1

我能够解决这个问题,但我不明白如何解决。

当我对数组执行追加操作时,最后追加的值将成为数组中所有记录的值。

var myBus=BusinessType.new()

func _on_load
   for i in businesses_json.get_data():
    
    myBus.name=i.name
    print ("showint previous array after name:")
    for j in Global.businesses:
        print (j.name)
    myBus.location=i.location
    print ("adding "+myBus.name)    
    Global.businesses.append(myBus)
    print ("now the global array is:")
    for j in Global.businesses:
        print (j.name)

这提供了下面的输出。

showint previous array after name:
adding first
now the global array is:
first
showint previous array after name:
second
adding second
now the global array is:
second
second
showint previous array after name:
third
third
adding third
now the global array is:
third
third
third
number business = 3

当我移动

var myBus=BusinessType.new()

within for i 循环然后我得到正确的输出

showint previous array after name:
adding first
now the global array is:
first
showint previous array after name:
first
adding second
now the global array is:
first
second
showint previous array after name:
first
second
adding third
now the global array is:
first
second
third
number business = 3

有人可以解释为什么在每个循环中重新定义变量可以解决问题吗?它是否以某种方式充当指针?这不是消耗更多的内存资源,每次迭代都要重新定义吗?

有更好的方法吗?

arrays append godot godot4
1个回答
0
投票

变量 myBus 在循环外部定义,并在所有迭代中使用。这意味着您多次将同一对象 (myBus) 附加到 Global.businesses 数组。因此,Global.businesses 中的每个元素最终都是对同一对象的引用。由于 myBus 是同一对象,因此对 myBus 所做的任何更改都会反映在 Global.businesses 中的所有条目中。当循环完成时,Global.businesses 中的所有条目都指向 myBus 的最后状态,因此所有记录都具有相同的值。当我需要单独的实例时,我尝试在循环或函数内实例化新对象。是的,每次迭代中的新对象都需要更多内存,但它可能可以忽略不计。

© www.soinside.com 2019 - 2024. All rights reserved.