从另一个函数中的python函数访问变量值

从另一个函数中的python函数访问变量值,python,function,variables,Python,Function,Variables,我有一个函数,它调用函数rlEncode,该函数应该获取数据列表并对其进行压缩,这样它就可以计算一行中有多少个值,并输出例如[1,5,3,2,5,6]等等。但当我运行它时,它只是一次又一次地输出[1,5],而不是在列表中的这么多空格上移动n值。如何从函数rlEncode中获取n值以在另一个函数中使用 def rlEncode(n,z,数据列表): 而数据列表[n]==数据列表[n+1]: z=z+1 n=n+1 而数据列表[n]!=数据列表[n+1]: 返回n 返回z def unitTest

我有一个函数,它调用函数rlEncode,该函数应该获取数据列表并对其进行压缩,这样它就可以计算一行中有多少个值,并输出例如[1,5,3,2,5,6]等等。但当我运行它时,它只是一次又一次地输出[1,5],而不是在列表中的这么多空格上移动n值。如何从函数rlEncode中获取n值以在另一个函数中使用

def rlEncode(n,z,数据列表):
而数据列表[n]==数据列表[n+1]:
z=z+1
n=n+1
而数据列表[n]!=数据列表[n+1]:
返回n
返回z
def unitTest():
c=0
n=0
z=1
数据列表=[1,1,1,1,3,5,5,5,5,6,8,8,1,1,1,5,5,5,13,14]
压缩列表=[]
而c<(len(数据列表)):
n=rlEncode(n,1,数据列表)
z=rlEncode(0,z,数据列表)
rlEncode(0,1,数据列表)
压缩=[数据列表[n],z]
c=c+1
压缩列表=压缩列表+压缩
打印(压缩列表)

n=n+1
Python按值传递不可变对象。请参见前面的回答:

在您的情况下,最简单的解决方案是让内部函数将
n
的值返回给外部函数,外部函数将其分配给其本地
n

compress
是一个列表,它是可变的,因此您可以使用
+=
对列表进行适当的修改,而不是创建新的局部变量

我还针对列表长度添加了一个检查,否则对
n+1
的引用将导致indexer错误

我也不认为您需要第二个
,而在rlEncode中使用
循环,但我会让您自行解决…:)

def rlEncode(n,z,数据列表,压缩):
而(n
我喜欢递归地做这些事情。Python在递归方面不是很好,但我想看看它是如何实现的,所以我想我将与大家分享:

def compress(lst):
    if not lst:
        return []
    current = lst[0]
    result = compress(lst[1:]) 

    if not result:
        # item is last
        return [(1, current)]
    nxt = result[0][1]

    if current == nxt:
        # items is same as next
        return [(result[0][0] + 1, current)] + result[1:]

    # different items
    return [(1, current)] + result
要使用它:

print [x[0] for x in compress(lst)]
显而易见且有效的方法是使用发电机:

def group_gen(lst):
    buff = []
    for item in lst:
        if buff and item == buff[0]:
            buff.append(item)
        else:
            if buff:
                yield buff
            buff = [item]
    if buff:
        yield buff

print list(map(len, group_gen(lst)))
使用以下方法检查:

print list(map(len, group_gen(lst)))

为什么要将“列表名称”传递到rlEncode中,然后不使用它?而是使用一个全局变量。使用“compress”时,既有全局变量,也有局部变量。您正在修改本地文件,然后将其丢弃,但希望更改全局文件。建议:重新操作,不要使用全局变量。谢谢。compress是一个列表,它是一个可变对象,因此您可以使用+=将列表添加到它本身,而不是创建一个新的局部变量。正如RobertB所指出的,在您的示例中也有一个输入错误,我是从变量名的变化猜出来的。我会更新我的答案。我把它改成现在的状态。由于某些原因,z的输出不正确,一直得到4。你能看看我哪里出了问题吗?谢谢
print list(map(len, group_gen(lst)))