python list.append()メソッドの落とし穴:次のデータによって上書きされる以前のデータの分析

問題の説明

リストのappend()メソッドを使用すると、以前のデータは常に次のデータで上書きされます

問題のあるコード

def process():
	proxies = {'180.97.104.97:80': '{"proxy": "180.97.104.97:80"}', \
	'123.125.114.18:80': '{"proxy": "123.125.114.18:80"}', \
	'123.125.115.242:80': '{"proxy": "123.125.115.242:80"}'}

	proxy_dict = {}	# 在循环外部定义字典
	cnt = 0
	proxy_list = []
	for proxy in proxies:
		print(proxy)
		ip, port = proxy.split(":")
		proxy_dict['ip'] = ip
		proxy_dict['port'] = port
	
		proxy_list.append(proxy_dict)
		cnt += 1

	print('total ip: ', cnt)

	return proxy_list

good_proxy = process()
print(good_proxy)

実行結果

リスト内のデータはすべて辞書の最後のデータであることがわかります。

[root@2c9a57af434c test]# python test.py 
total ip:  3
[{'ip': '123.125.115.242', 'port': '80'}, {'ip': '123.125.115.242', 'port': '80'}, {'ip': '123.125.115.242', 'port': '80'}]

解決策

コード


```python
def process():
	proxies = {'180.97.104.97:80': '{"proxy": "180.97.104.97:80"}', \
	'123.125.114.18:80': '{"proxy": "123.125.114.18:80"}', \
	'123.125.115.242:80': '{"proxy": "123.125.115.242:80"}'}

	
	cnt = 0
	proxy_list = []
	for proxy in proxies:
		proxy_dict = {} # 字典定义在循环内部
		ip, port = proxy.split(":")
		proxy_dict['ip'] = ip
		proxy_dict['port'] = port
	
		proxy_list.append(proxy_dict)
		cnt += 1

	print('total ip: ', cnt)

	return proxy_list

good_proxy = process()
print(good_proxy)

実行結果

辞書の各要素はリストに配置されます。

[root@2c9a57af434c test]# python test.py 
total ip:  3
[{'ip': '180.97.104.97', 'port': '80'}, {'ip': '123.125.114.18', 'port': '80'}, {'ip': '123.125.115.242', 'port': '80'}]

説明する

辞書はループの外で定義され、アドレスは1つだけです。ループごとにアドレスは変更されないため、前のデータは上書きされます。シャローコピーとディープコピーの側面から理解できます。

Pythonでのオブジェクト間の割り当ては参照によって渡されます。オブジェクトをコピーする必要がある場合は、標準ライブラリのコピーモジュールを使用する必要があります。

  • copy.copy浅いコピーでは、親オブジェクトのみがコピーされ、オブジェクトの内部の子オブジェクトはコピーされません。
  • copy.deepcopyディープコピーコピーオブジェクトとそのサブオブジェクト
公開された134元の記事 ウォンの賞賛119 ビュー310 000 +

おすすめ

転載: blog.csdn.net/jobbofhe/article/details/105099185
おすすめ