Lebih baik untuk menggambarkan pertanyaan saya dengan contoh. Misalkan saya memiliki kode berikut:

from pprint import pprint

def remove(**kwargs):
    del kwargs['first']


d = {'first': {'x': 10}, 'second': {'a': '1'}}
logger.debug(f"{pprint(d)}")
remove(**d)
logger.debug(f"{pprint(d)}")

Keluarannya adalah:

{'first': {'x': 10}, 'second': {'a': '1'}}

{'first': {'x': 10}, 'second': {'a': '1'}}

Artinya kunci 'first' masih ada seolah-olah kita telah melewati dict d berdasarkan nilai, sehingga perubahan apa pun di dalamnya di dalam fungsi tidak terlihat oleh pemanggil.

Saya berharap d saya diteruskan dengan referensi, yaitu dict saya dimodifikasi, saya berharap untuk melihat output berikut:

{'first': {'x': 10}, 'second': {'a': '1'}}

{'second': {'a': '1'}}

Mengapa saya salah?

0
alexsmail 19 November 2020, 09:58

1 menjawab

Jawaban Terbaik

Anda tidak meneruskan d ke fungsi, Anda memperluas nilai dari d sebagai argumen bernama ke fungsi. Dalam fungsi yang dimaksud, Anda kemudian menerimanya sebagai kamus lagi, tetapi jika Anda meneruskan nilai sebagai argumen bernama atau menerima nilai sebagai argumen bernama, nilai tersebut tidak akan berasal atau berakhir di kamus masing-masing.

Misalnya jika Anda dapat mengubah sumber **kwargs, apa artinya dalam kasus ini?

remove(first={'x': 10}, second={'a': '1'})

Itu tidak masuk akal.

Jika Anda ingin menyelesaikan tindakan seperti yang tersirat oleh nama fungsi Anda, Anda ingin meneruskan objek kamus sebagai argumen secara langsung; maka dengan referensi dan modifikasi dalam fungsi akan berfungsi seperti yang Anda harapkan.

def remove(dictarg):
    del dictarg['first']
d = {'first': {'x': 10}, 'second': {'a': '1'}}
remove(d)
pprint(d)

>>> {'second': {'a': '1'}}
1
B. Morris 19 November 2020, 07:13