Мутирование входящего объекта Python по ссылке - PullRequest
1 голос
/ 25 марта 2019

У меня есть законная ситуация, подобная этой, когда мне нужно реализовать метод, который изменяет сам входящий объект (преобразовать список в dict)

def f(l): # f is a function that receives a list as input
    pass # Implement this


x = ['Hello', 'World']
f(x)
print(x) # x is now a dict {'hello':'world'}

Как вы реализуете выше f()?

Ключевым моментом является то, что при вызове f() входящий сам объект должен быть преобразован в другой тип.

Примечание. Подлинные ответы приветствуются, а не ставят под сомнение ситуацию.

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Python не имеет способа делать то, что вы хотите. Вы не можете изменить привязку переменной в вызывающем контексте изнутри функции.

Конечно, «не может» быть квалифицированным: Python имеет много возможностей для самоанализа, даже позволяя вам исследовать стек вызовов, а также глобальные и локальные значения в вызывающих фреймах. Но я настоятельно рекомендую не идти таким путем.

Я знаю, что вы сказали, что не хотите, чтобы люди ставили под сомнение необходимость этого, но я не могу не думать, что есть лучший способ решить проблему.

0 голосов
/ 25 марта 2019

Я не думаю, что это возможно, так как вы можете изменить изменяемый файл при его передаче, чтобы он отражал изменения в глобальной области видимости, но вы не можете изменить то, на что он ссылается.

def f(x):

    z = dict()
    for i in range(0,len(x),2):
        z[x[i]] = x[i+1]

    # x = z
    x.append(1)
    return x


x=[1,2]
z=f(x)
print(z) #[1, 2, 1]
print(x) #[1, 2, 1]

Но

def f(x):

    z = dict()
    for i in range(0,len(x),2):
        z[x[i]] = x[i+1]

    x = z
    return x


x=[1,2]
z=f(x)
print(z) #{1: 2}
print(x) #[1, 2]

Python позволяет вам изменять глобальную область видимости изменяемых переменных, но вы не можете изменить саму ссылку.

...