疑难理解通过参考

本文关键字:参考 难理解 | 更新日期: 2023-09-27 18:05:30

我发现在c#中很难理解引用传递。在我的代码中有一个函数,它接受两个参数

private bool SerialUnEscape(byte serialData, ref byte serialResult)
    {
        if (((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_START) ||
                     ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_END)) {
            serialEscaped = false;
            serialResult = 0;
            return (true);
            }
        } else if (serialEscaped) {
            if ((SerialProcessValue)serialData == SerialProcessValue.SERIAL_PACKET_ESCAPE_START) {
                serialResult = (int)SerialProcessValue.SERIAL_PACKET_START;
                serialEscaped = false;
                return (true);
            } 
        } else {
            serialResult = serialData;
            return (true);
        }
    }

我调用的函数引用为serialDataLsb &serialDataMsb .

现在我的困惑是,serialDataLsbserialDataMsb的值是多少,它得到serialResult的值吗??

  for (i = 0; i < serialElements; i++) {
    serialDataLsb = 0;
    serialDataMsb = 0;
    while (serialBufferWalk < serialIndex) {
        if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataLsb)) {
            break;
                }
               }
    while (serialBufferWalk < serialIndex) {
        if (SerialUnEscape(serialBuffer[serialBufferWalk++], ref serialDataMsb)) {
            break;
            }
        }
serialElementData[i] = (UInt16)(serialDataLsb + (serialDataMsb << 8));
}

,我需要将这段代码移植到python中,1)我如何在python

中实现引用传递

我试着用这个

while serialBufferWalk < serialIndex:
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb):
        break
while serialBufferWalk < serialIndex:
    if self.SerialUnEscape(serialBuffer[serialBufferWalk += 1],serialDataLsb):
        break

疑难理解通过参考

如果您真的想模仿引用传递,而不是修改代码来返回值,您可以将想要更改的原语包装在对象中。为简单起见,我使用了一个列表:

def change_reference(byteContainer):
    byteContainer[0] = 42
b = 123
print(b) # Prints 123
# Copy the data into the container list.
container = [b]
# Pass a pointer to that list into the function.
change_reference(container)
# Take the value out of the container.
b = container[0]
print(b) # Prints 42

这使得你的函数非常混乱。真正应该做的是将修改后的字节包含在返回值中:

def test_and_subtract(v):
    if v == 1:
        return (v - 1, True)
    return (v - 2, False)
v = 1
v, b = test_and_subtract(v)
print(v) # 0
print(b) # True
v = 5
v, b = test_and_subtract(v)
print(v) # 3
print(b) # False

这里return (v - 1, True)将两个结果放入一个元组,b, v将它们从该元组中删除。