Функция рекурсивной печати удаляет элементы параметра - PullRequest
0 голосов
/ 03 мая 2019

Я создал функцию, которая просматривает любую гибридную структуру данных dict / list и печатает ее, используя рекурсию (потому что это более эффективно и увлекательно). Проблема в том, что после вызова он уничтожает переменную своего параметра. И не только переменная параметра, но и любая другая подструктура отца / сына:

Father variable: Son = Father
Son variable: InheritSonSecondLevel = Son 

Если я вызову свою функцию как Func(Son) или Func(Father) или Func(InheritSonSecondLevel), все содержимое структуры будет уничтожено. Там не так много, я могу попробовать. Я использую эту гибридную структуру данных. Давайте назовем это: гибрид.

Это внутри for. hybrid = functionX()

Поскольку printRecursiveDictionary() убьет мой контент, я называю это в конце. И создайте list на основе содержимого гибрида. Что-то вроде: fullContent=fullContent+[["A Label",hybrid]]

Тогда printRecursiveDictionary() вызывается. for заканчивается, и я использую fullContent() для чего-то. Тогда, к удивлению, остается только матрица с метками и пустыми словарями.

def printRecursiveDictionary(dictionary,deepness=0):
if(isinstance(dictionary,list) and dictionary!=[]):
    if(isinstance(dictionary[0],dict) or 
    isinstance(dictionary[0],list)):
        print("A")
        printRecursiveDictionary(dictionary[0],deepness+1)
else:
    print("B")
    print("\t"*deepness,dictionary[0])
    printRecursiveDictionary(dictionary[1:],deepness)

elif(isinstance(dictionary,dict) and dictionary!={}):
    if(isinstance(list(dictionary.values())[0],dict) or 
    isinstance(list(dictionary.values())[0],list)):
        print("C")
        print("\t"*deepness+str(list(dictionary.keys())[0]))
        printRecursiveDictionary(
        list(dictionary.values())[0],
        deepness+1
        )
    else:
        print("D")
        print("\t"*deepness+str(list(dictionary.keys())[0])+":"+str(list(dictionary.values())[0]))
        dictionary.pop(list(dictionary.keys())[0])
        printRecursiveDictionary(dictionary,deepness)


x=[0,{1:1,2:2,3:3}]
print(x)
y = x
print(y)
printRecursiveDictionary(y)

print(y)
print(x)

Результат будет:

[0, {1: 1, 2: 2, 3: 3}]
[0, {1: 1, 2: 2, 3: 3}]
B
 0
A
D
    1:1
D
    2:2
D
    3:3
[0, {}]
[0, {}]

1 Ответ

0 голосов
/ 03 мая 2019

Проблема в том, что после вызова он уничтожает параметр переменная.

Ниже приведена переделка printRecursiveDictionary(), которая не разрушает его параметр. Этот код предполагает Python 3, если вам нужен Python 2, оставьте комментарий, и я предоставлю модификацию для более старой версии:

def printRecursiveDictionary(dictionary, deepness=0):
    if isinstance(dictionary, list) and dictionary:
        if isinstance(dictionary[0], (dict, list)):
            print("A")
            printRecursiveDictionary(dictionary[0], deepness + 1)
        else:
            print("B")
            print("\t" * deepness, dictionary[0])
            printRecursiveDictionary(dictionary[1:], deepness)

    elif isinstance(dictionary, dict) and dictionary:

        (key, value), *remainder = dictionary.items()

        if isinstance(value, (dict, list)):
            print("C")
            print("\t" * deepness, key)
            printRecursiveDictionary(value, deepness + 1)
        else:
            print("D")
            print("\t" * deepness, str(key) + ":" + str(value))
            printRecursiveDictionary(dict(remainder), deepness)

x = [0, {1:1, 2:2, 3:3}]
y = x
print('x:', x)
print('y:', y)

printRecursiveDictionary(y)
print('x:', x)
print('y:', y)

OUTPUT

> python3 test.py
x: [0, {1: 1, 2: 2, 3: 3}]
y: [0, {1: 1, 2: 2, 3: 3}]
B
 0
A
D
     1:1
D
     2:2
D
     3:3
x: [0, {1: 1, 2: 2, 3: 3}]
y: [0, {1: 1, 2: 2, 3: 3}]
> 
...