难以理解引用传递

Trouble understanding pass by reference

提问人:user2345 提问时间:7/31/2015 最后编辑:Jon Skeetuser2345 更新时间:8/1/2015 访问量:127

问:

我发现在 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);
        }

    }

我调用的函数引用为 & 。serialDataLsbserialDataMsb

现在我的困惑是关于,or 的价值是什么, 它是否得到 ??serialDataLsbserialDataMsbserialResult

  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
C# Python 按引用传递

评论

0赞 Haris 7/31/2015
C != C# ..下次请正确标记问题
3赞 James Thorpe 7/31/2015
如果不需要将值传递到函数中,请考虑改用 out 关键字
1赞 Jon Skeet 7/31/2015
在我看来,这段代码更多的是关于 Python 而不是 C#。我建议你从 Python 返回一个元组......
0赞 user2345 7/31/2015
但是我怎样才能在python中获取serialDataLsb或serialDataMsb的值

答:

0赞 31eee384 8/1/2015 #1

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

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