Python:如何在类函数中从(main)数组获取更改

aurhwmvo  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(101)

我想在类函数中操作数组的许多部分。我将这些部分作为一个数组返回。它与原始数组的一部分具有相同的结构。我知道,我不能从类函数中更新原始数组,因为它不是“全局”的。
如果我用这个返回的部分数组更新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.错误
我该如何解决这个问题?

dtcbnfnu

dtcbnfnu1#

这里的问题是,在代码继续运行时,SENSOR_config_array["Sensors"]A10_sensors_class对象的SensorData属性之间的初始链接丢失。
创建A10_sensors_class对象时:

A10_sensors_class = sensors.deal_with_sensorData(SENSOR_config_array)

即当对象在__init__()方法中初始化时

def __init__(self, config_data):
    self.SensorData = defaultdict(set)
    self.SensorData = config_data["Sensors"]

self.SensorDataA10_sensors_class.SensorData)和config_data["Sensors"]SENSOR_config_array["Sensors"])是相同的defaultdict对象。
然而,通过这种分配:

SENSOR_config_array["Sensors"] = ret

您将不同的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,而是只分配特定的值。

相关问题