我想在类函数中操作数组的许多部分。我将这些部分作为一个数组返回。它与原始数组的一部分具有相同的结构。我知道,我不能从类函数中更新原始数组,因为它不是“全局”的。
如果我用这个返回的部分数组更新main中的原始数组,我可以访问main中的新值,但不能访问类中的新值。在类函数中,值是旧值。
但如果我只改变一个值,而不是原始数组的整个结构部分,它似乎是有效的。
类似问题:如果我在main中展开数组“SENSOR_config_array”,它们将不会“到达”类函数
main.py
#!/usr/bin/env python
# coding: utf8
from collections import defaultdict
import test_class as sensors
import copy
SENSOR_config_array=defaultdict(dict)
SENSOR_config_array["Sensors"]=defaultdict(dict)
SENSOR_config_array["Sensors"]["actualVal"]=3
SENSOR_config_array["Sensors"]["maxVal"]=10
A10_sensors_class = sensors.deal_with_sensorData(SENSOR_config_array)
print ("original SENSOR_config_array:")
print (SENSOR_config_array)
print()
ret=A10_sensors_class.make_DataString() ## return "maxVal" should change to 20
print ("1. ret :")
print (ret) ## OK
print()
SENSOR_config_array["Sensors"]["maxVal"]=20 ## "maxVal" set to 20
ret=A10_sensors_class.make_DataString() ## return "maxVal" should =40
print ("2. ret :")
print (ret) ## OK
SENSOR_config_array["Sensors"]=ret ## "maxVal" set to (returned)40
print ("2. SENSOR_config_array:")
print (SENSOR_config_array["Sensors"]) ## 40 !!! it seems to be updated!!!
print()
ret=A10_sensors_class.make_DataString() ## return "maxVal" should =80
print ("3. ret:")
print (ret) ## NO !!
print()
SENSOR_config_array["Sensors"]["Val"]=90
ret=A10_sensors_class.make_DataString2() ## return "maxVal" should =180
print ("4. ret:")
print (ret) ## NO !!
print()
测试类.py
#!/usr/bin/env python
# coding: utf8
from collections import defaultdict
class deal_with_sensorData:
def __init__(self, config_data):
self.SensorData=defaultdict(set)
self.SensorData=config_data["Sensors"]
## config_data has e.g.
## config_data["Busses"]["type"]
## config_data["Sensors"]["actualVal"]
## config_data["Sensors"]["maxVal"]
def make_DataString(self):
temp=defaultdict(dict)
temp["maxVal"]=self.SensorData["maxVal"]*2
return temp
def make_DataString2(self):
temp=defaultdict(dict)
temp["Val"]=self.SensorData["Val"]*2
return temp
输出:
原始传感器配置阵列:
defaultdict(〈类'指令'〉,{'传感器':默认字符(〈class 'dict'〉,{'实际值':3、“最大值”:10})})
1.电话:
默认字符(〈class 'dict'〉,{'maxVal':20年)
1.电话:
默认字符(〈class 'dict'〉,{'maxVal':40年)
1.调用ret:
默认字符(〈class 'dict'〉,{'maxVal':40年)
1.调用ret:
默认字符(〈class 'dict'〉,{'maxVal':40年)
1.错误
我该如何解决这个问题?
1条答案
按热度按时间dtcbnfnu1#
这里的问题是,在代码继续运行时,
SENSOR_config_array["Sensors"]
和A10_sensors_class
对象的SensorData
属性之间的初始链接丢失。创建
A10_sensors_class
对象时:即当对象在
__init__()
方法中初始化时self.SensorData
(A10_sensors_class.SensorData
)和config_data["Sensors"]
(SENSOR_config_array["Sensors"]
)是相同的defaultdict
对象。然而,通过这种分配:
您将不同的
defaultdict
对象链接到SENSOR_config_array["Sensors"]
,从而断开了SENSOR_config_array["Sensors"]
和A10_sensors_class.SensorData
之间的初始链接,因此SENSOR_config_array["Sensors"]
中的变化不再影响A10_sensors_class
对象的属性SensorData
,如果您检查对象的id,这一点就会变得很明显。这就是为什么
maxVal
在第三次重试中的改变不起作用。这就是为什么调用方法make_DataString2()
在temp["Val"] = self.SensorData["Val"] * 2
中产生错误。你试图乘以还不存在的值。为了避免这种情况,您可以返回值,而不是方法
make_DataString()
和make_DataString2()
中的dict,并且不是分配整个dict,而是只分配特定的值。