問題の説明
リストの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ディープコピーコピーオブジェクトとそのサブオブジェクト